2017-04-01 22 views
7

Tworzę swój własny pionowy skrypt mongolski TextView (i EditText) od podstaw, rozszerzając View. Próbuję zrozumieć, w jaki sposób migający kursor jest zaimplementowany w Android TextView source code. Wydaje się być obsługiwane przez instancję mEditor z Editor class. W tej klasie znalazłem drawCursor metody:W jaki sposób Android EditText (TextView) narysuje migający kursor?

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

Podobno sam kursor jest Drawable jakiegoś typu.

Więc znajduję kawałki, ale nie mogę zobaczyć lasu przez drzewa. Czy ktoś, kto rozumie to lepiej ode mnie, mówi po angielsku, jak działa migający kursor?

Oto kilka konkretnych punktów ja naprawdę nie rozumiem: związek

  • kursora do TextView (lub EditText), Layout, Editor i Drawable.
  • Za każdym razem, gdy kursor miga, czy cały tekst jest przerysowywany, czy tylko obszar kursora?

Uwaga:

Zaakceptowanych odpowiedź odpowiedzi na moje pytanie jak spytałem go. Byłbym jednak zadowolony z przyjęcia innej odpowiedzi, jeśli ktokolwiek może dodać bardziej kanoniczną, która wyjaśnia szczegóły bardziej szczegółowo.

Odpowiedz

10
  1. EditText tylko edytowalne TextView, Layout służy do pomiarów, obliczeń, gdzie i jak tekst będzie rozplanowany. Drawable jest po to, aby utrzymać wygląd kursora, a następnie być rysowane na Canvas.
  2. Tylko kursor Path to invalidated.

Miga zasadzie jest rekurencyjna Runnable że Handler wykonuje co 500ms (zgadywania), na on-off mody i jest przełożony podczas EditText ma ostrości. To również może być osiągnięty poprzez zapętlenie ValueAnimator int, gdzie kursor odkształcalne alfa będzie być przełączane pomiędzy 0 a 255.

+3

Trick odwołuje się do konkretnych linii kodu w GitHub it warte przegrania sam w sobie! – Suragch

1

można znaleźć this method in the TextView class:

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(); 
    } 
} 
Powiązane problemy