2016-10-20 11 views
1

EditTextでカーソルがある線を強調表示したい。私は半透明のビューをライン上で実行します。 EditTextで画面上に文字座標を取得する必要があります。 (行の最初と最後の1つ)私が見つけた最高のものは、テキストディメンションを取得していましたが、これは私が望むものには使用できません。どこから始めたらいいかわからないので、何もしなかった。カーソルの現在の線の画面座標を取得する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" /> 

あなたはAPPCOMPATライブラリとその設備を使用している場合ことに注意してください、あなたの代わりにextends AppCompatEditText、着色を確保するため必要があるとその他もろもろが適切に処理されています。

関連する問題