2017-04-01 220 views
7

我正在通過擴展View從頭開始編寫我自己的蒙古文垂直腳本TextView(和EditText)。我試圖瞭解如何在Android TextView source code中實現閃爍的光標。它似乎由Editor classmEditor實例處理。在該類中,我發現一個drawCursor方法:Android EditText(TextView)如何繪製閃爍的光標?

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

顯然,光標本身是某種類型的Drawable

所以我找到了碎片,但我無法通過樹木看到森林。能夠比我更好地理解這一點的人能否用簡單的英語告訴我閃爍的光標是如何工作的?

下面是一些具體點我真的不明白:

  • 光標的關係,以TextView(或EditText),LayoutEditorDrawable
  • 每次光標閃爍時,是否所有正在重繪的文本或只有光標區域?

注:

接受的答案回答我的問題,我問它。不過,如果任何人都可以添加更詳細的解釋事項的規範,我會很樂意接受不同的答案。

回答

10
  1. EditText只是編輯TextViewLayout用於測量,計算,在哪裏以及如何文本將佈局。 Drawable是否只是爲了保持光標的外觀,後來在Canvas上繪製。
  2. 只有光標Pathinvalidated

基本上閃爍是遞歸Runnable一個Handler執行每500ms(猜測),在開閉的方式,並且它被重新調度而EditText具有焦點。這也可以通過循環INT,當光標繪製阿爾法將介於0和255之間進行切換的ValueAnimator實現

+3

訣竅鏈接到GitHub上它特定的代碼行本身值得讚揚! – Suragch

1

你可以找到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(); 
    } 
}