Android EditText(TextView)如何绘制闪烁的光标?

时间:2017-04-01 04:33:32

标签: android android-edittext textview

我通过扩展TextView从头开始创建我自己的蒙古文垂直脚本EditText(和View)。我试图了解如何在Android TextView source code中实现闪烁光标。它似乎由Editor classmEditor实例处理。在那个课程中,我找到了drawCursor方法:

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的关系。
  • 每次光标闪烁时,是重绘所有文本还是只重绘光标区域?

注意:

接受的答案在我问的时候回答了我的问题。但是,如果有人能够添加一个更详细解释事物的更规范的答案,我会很高兴接受一个不同的答案。

2 个答案:

答案 0 :(得分:10)

  1. EditText只是可编辑的TextViewLayout用于测量,计算,文本的放置位置和方式。 Drawable仅用于保持光标的外观,稍后在Canvas上绘制。
  2. 只有游标Pathinvalidated
  3. 闪烁基本上是递归RunnableHandler每隔500毫秒(猜测)以开关的方式执行,并且在EditText具有焦点时重新安排。这也可以通过循环ValueAnimator的int来实现,其中光标可绘制的alpha将在0到255之间切换。

答案 1 :(得分:2)

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