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

9

我正在从头开始扩展View,制作自己的蒙古语竖排文字TextView(和EditText)。我试图理解Android TextView源代码中闪烁光标的实现方式。它似乎由EditormEditor实例处理。在该类中,我找到了一个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个回答

10
  1. EditText 是可编辑的 TextViewLayout 用于测量、计算文本将如何布局以及其位置。 Drawable 仅用于保持光标的外观,并在 Canvas 上绘制。
  2. 只有光标的 Path 被使无效 (invalidated)。

闪烁基本上是递归的 Runnable,由 Handler 每500ms (猜测) 执行一次,以开关方式进行,并在 EditText 获得焦点时重新安排。这也可以通过循环整数的 ValueAnimator 来实现,其中光标 drawable 的 alpha 值在0和255之间切换。


3
在GitHub上链接到特定代码行的技巧本身就值得点赞! - Suragch

2
你可以在 TextView 类中找到 这个方法:
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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接