1
我想用EditText高亮顯示光標所在的行。我有一個半透明的視圖,將發生在線上。我需要在EditText中獲得屏幕上的字符座標。 (第一行和最後一行)我發現的最好的方法是獲取文本尺寸,但這不能用於我想要的內容。我什麼都沒試,因爲我不知道從哪裏開始。獲取光標當前行的屏幕座標EditText
這可能嗎? 如果不是我該怎麼做?
我想用EditText高亮顯示光標所在的行。我有一個半透明的視圖,將發生在線上。我需要在EditText中獲得屏幕上的字符座標。 (第一行和最後一行)我發現的最好的方法是獲取文本尺寸,但這不能用於我想要的內容。我什麼都沒試,因爲我不知道從哪裏開始。獲取光標當前行的屏幕座標EditText
這可能嗎? 如果不是我該怎麼做?
這可以通過繼承EditText
並在其他方法繪製之前插入突出顯示效果到其onDraw()
方法中來實現。 EditText
的Layout
對象可以給我們從當前光標位置開始的行號,我們可以通過它得到界限,如Rect
。然後我們繪製高亮矩形,並調用超級方法來繪製其餘的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" />
請注意,如果您使用的程序兼容性庫及其設施,則應改爲extends AppCompatEditText
,保證了着色和諸如此類的東西得到正確處理。