2017-04-01 223 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(); 
    } 
}