2016-10-20 2 views
1

Ich möchte die Linie mit dem Cursor darauf in einem EditText markieren. Ich habe eine halbtransparente Ansicht, die über die Linie stattfinden wird. Ich brauche eine Zeichenkoordinaten auf dem Bildschirm in einem EditText. (die erste und letzte der Zeile) Das Beste, was ich fand, war eine Textgröße zu bekommen, aber das kann nicht für das verwendet werden, was ich will. Ich habe nichts versucht, weil ich keine Ahnung habe, wo ich anfangen soll.Get Bildschirmkoordinaten der aktuellen Cursorlinie EditText

Ist das möglich? Wenn nicht wie kann ich es tun?

Antwort

3

Dies kann ziemlich einfach durch Unterklassen EditText erreicht werden, und Einfügen der Highlight-Effekt in seiner onDraw() Methode, bevor alles andere gezeichnet wird. EditText 's Layout Objekt kann uns die Zeilennummer von der aktuellen Cursorposition geben, mit der wir die Grenzen als Rect bekommen können. Wir zeichnen dann das Highlight-Rechteck und rufen die Super-Methode auf, um den Rest der View zu zeichnen.

Zum Beispiel:

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(); 
    } 
} 

Sie können in Ihren Layouts wie gewohnt diese benutzerdefinierte Klasse gehören. Zum Beispiel:

<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" /> 

Bitte beachten Sie, dass, wenn Sie die AppCompat Bibliothek und seine Annehmlichkeiten verwenden, sollten Sie stattdessen extends AppCompatEditText, die Tönung und so weiter entsprechend behandelt werden, um sicherzustellen.

Verwandte Themen