2017-04-01 96 views
7

TextView (ve EditText) kendi Moğol dikey komut dosyasını View genişleterek sıfırdan yapıyorum. Yanıp sönen imlecin Android TextView source code'da nasıl uygulandığını anlamaya çalışıyorum. Editor class'un mEditor örneğiyle ele alınmış gibi görünüyor.Android EditText (TextView) yanıp sönen imleci nasıl gösterir?

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

Görünüşe göre, imleç kendisi bazı tip bir Drawable: yani sınıfta ben drawCursor yöntemi bulundu.

Bu yüzden parçaları buluyorum, ancak ormanı ağaçların arasından göremiyorum. Bunu benden daha iyi anlayan biri, basit İngilizce'de, yanıp sönen imlecin nasıl çalıştığını söyleyebilir mi? İşte

Gerçekten anlamıyorum bazı özel noktalar şunlardır:

  • imlecin TextView (veya EditText) için ilişki, Layout, Editor ve Drawable.
  • İmleç her yanıp söndüğünde, tüm metin yeniden çiziliyor mu veya yalnızca imleç bölgesi mi?

Not: Sordum olarak

kabul cevap sorumu cevaplar. Ancak, herhangi bir şeyi daha detaylı açıklayan daha kanonik bir kişi ekleyebilirse farklı bir cevabı kabul etmekten memnuniyet duyarım.

cevap

10
  1. EditTextTextView, Layout ölçümler, hesaplama, nerede ve nasıl metin ortaya koydu olacaktır kullanılır sadece düzenlenebilir. Drawable sadece imlecin görünümünü tutmak için var, daha sonra Canvas çekiliyor.
  2. Yalnızca imleç Path, invalidated şeklindedir. temelde Yanıp sönen

bir Handler açma-kapama moda her 500ms (tahmin), yürütür ve EditText odağı varken o ertelenmişti olduğunu Runnable özyinelemeli olduğunu. Bu aynı zamanda

+3

hüner GitHub'dan bunun belirli kod hatları bağlamak için kendi başına bir değer! – Suragch

1

Sen this method in the TextView class bulabilirsiniz imleç çekilebilir alfa 0 ile 255 arasında geçiş yapılacaktır int ait ValueAnimator döngü sağlanabilir:

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