gpt4 book ai didi

android - 获取光标当前行的屏幕坐标 EditText

转载 作者:太空狗 更新时间:2023-10-29 16:30:34 40 4
gpt4 key购买 nike

我想在 EditText 中突出显示光标所在的行。我有一个半透明的 View ,它将在线上进行。我需要在 EditText 中获取屏幕上的字符坐标。 (该行的第一个和最后一个)我发现最好的是获取文本尺寸,但这不能用于我想要的。我什么也没尝试,因为我不知道从哪里开始。

这可能吗?如果不能,我该怎么做?

最佳答案

这可以通过继承 EditText 并在绘制其他所有内容之前在其 onDraw() 方法中插入高亮效果来轻松实现。 EditTextLayout 对象可以为我们提供从当前光标位置开始的行号,我们可以通过它获得作为 Rect 的边界。然后我们绘制高亮矩形,并调用 super 方法绘制 View 的其余部分。

例如:

public class HighlightEditText extends EditText {

private static final int HIGHLIGHTER_YELLOW = 0x88f3f315;

private Rect lineBounds;
private Paint highlightPaint;
private int lineNumber;
private boolean lineHighlightEnabled = true;

public HighlightEditText(Context context) {
this(context, null);
}

public HighlightEditText(Context context, AttributeSet a) {
super(context, a);

lineBounds = new Rect();
highlightPaint = new Paint();
highlightPaint.setColor(HIGHLIGHTER_YELLOW);
}

@Override
protected void onDraw(Canvas canvas) {
if (lineHighlightEnabled) {
lineNumber = getLayout().getLineForOffset(getSelectionStart());
getLineBounds(lineNumber, lineBounds);

canvas.drawRect(lineBounds, highlightPaint);
}

super.onDraw(canvas);
}

public void setLineHighlightEnabled(boolean enabled) {
lineHighlightEnabled = enabled;
invalidate();
}

public boolean isLineHighlightEnabled() {
return lineHighlightEnabled;
}

public void setLineHighlightColor(int color) {
highlightPaint.setColor(color);
if (lineHighlightEnabled) {
invalidate();
}
}

public int getLineHighlightColor() {
return highlightPaint.getColor();
}
}

您可以像往常一样在您的布局中包含此自定义类。例如:

<com.mycompany.myapp.HighlightEditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="top|left"
android:imeOptions="flagNoExtractUi" />

请注意,如果您正在使用 AppCompat 库及其便利设施,您应该改为扩展 AppCompatEditText,以确保正确处理着色和诸如此类的问题。

关于android - 获取光标当前行的屏幕坐标 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40154403/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com