2017-04-01 8 views
7

Ich mache mein eigenes mongolisches vertikales Skript TextView (und EditText) von Grund auf neu, indem ich View verlängere. Ich versuche zu verstehen, wie der blinkende Cursor in Android TextView source code implementiert ist. Es scheint von einer mEditor Instanz der Editor class behandelt zu werden. In dieser Klasse fand ich eine drawCursor Methode:Wie zeichnet ein Android EditText (TextView) den blinkenden Cursor?

private void drawCursor(Canvas canvas, int cursorOffsetVertical) { 
    final boolean translate = cursorOffsetVertical != 0; 
    if (translate) canvas.translate(0, cursorOffsetVertical); 
    for (int i = 0; i < mCursorCount; i++) { 
     mCursorDrawable[i].draw(canvas); 
    } 
    if (translate) canvas.translate(0, -cursorOffsetVertical); 
} 

Offenbar die Cursor selbst ist ein Drawable irgendeine Art.

So finde ich Stücke, aber ich kann den Wald nicht durch die Bäume sehen. Könnte jemand, der das besser versteht als ich, mir in einfacher Sprache sagen, wie der blinkende Cursor funktioniert?

Hier sind einige spezifische Punkte, die ich nicht wirklich verstehen:

  • Die Beziehung des Cursor auf die TextView (oder EditText), Layout, Editor und Drawable.
  • Jedes Mal, wenn der Cursor blinkt, wird der gesamte Text neu gezeichnet oder nur die Cursor-Region?

Hinweis:

Die akzeptierte Antwort beantwortet meine Frage, wie ich sie gefragt. Ich würde jedoch gerne eine andere Antwort akzeptieren, wenn jemand eine kanonischere hinzufügen könnte, die die Dinge detaillierter erklärt.

Antwort

10
  1. EditText ist nur editierbar TextView, Layout für Messungen verwendet wird, Berechnung, wo und wie der Text angelegt. Drawable gibt es nur, um das Aussehen des Cursors zu halten, der später auf der Canvas gezeichnet wird.
  2. Nur Cursor Path ist invalidated.

Blinzeln Grunde ist rekursiv Runnable dass ein Handler alle 500 ms ausgeführt wird (erraten), in Ein-Aus-Mode, und es neu geplant wird, während EditText Fokus hat. Dies kann auch durch Looping ValueAnimator von int erreicht werden, in dem der Cursor ziehbar alpha wird zwischen 0 und 255

+3

Der Trick in GitHub auf bestimmte Codezeilen zu verknüpfen eine Aufwertung wert! – Suragch

1

Sie können this method in the TextView class finden hin- und hergeschaltet werden:

public void setCursorVisible(boolean visible) { 

    if (visible && mEditor == null) return; // visible is the default value with no edit data 
    createEditorIfNeeded(); 
    if (mEditor.mCursorVisible != visible) { 
     mEditor.mCursorVisible = visible; 
     invalidate(); 

     mEditor.makeBlink(); 

     // InsertionPointCursorController depends on mCursorVisible 
     mEditor.prepareCursorControllers(); 
    } 
} 
Verwandte Themen