2016-10-20 115 views
1

我想用EditText高亮顯示光標所在的行。我有一個半透明的視圖,將發生在線上。我需要在EditText中獲得屏幕上的字符座標。 (第一行和最後一行)我發現的最好的方法是獲取文本尺寸,但這不能用於我想要的內容。我什麼都沒試,因爲我不知道從哪裏開始。獲取光標當前行的屏幕座標EditText

這可能嗎? 如果不是我該怎麼做?

回答

3

這可以通過繼承EditText並在其他方法繪製之前插入突出顯示效果到其onDraw()方法中來實現。 EditTextLayout對象可以給我們從當前光標位置開始的行號,我們可以通過它得到界限,如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,保證了着色和諸如此類的東西得到正確處理。