问题描述
我想在EditText
中突出显示光标所在的行。我有一个半透明的View
,它将在线上进行。我需要在EditText
中获取屏幕上的字符坐标。 (第一行和最后一行)我发现最好的是获得文本尺寸,但这不能用于我想要的。我什么都没试过,因为我不知道从哪里开始。
这可能吗? 如果没有,我该怎么办?
最佳答案
这可以通过继承EditText
并在其onDraw()
方法中插入高亮效果来完成,然后再绘制其他所有内容。EditText
的Layout
对象可以给我们从当前光标位置开始的行号,我们可以通过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,以确保正确处理着色和其他内容。
Comments | NOTHING