我通过扩展TextView
从头开始创建我自己的蒙古文垂直脚本EditText
(和View
)。我试图了解如何在Android TextView
source code中实现闪烁光标。它似乎由Editor
class的mEditor
实例处理。在那个课程中,我找到了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
),Layout
,Editor
和Drawable
的关系。注意:
接受的答案在我问的时候回答了我的问题。但是,如果有人能够添加一个更详细解释事物的更规范的答案,我会很高兴接受一个不同的答案。
答案 0 :(得分:10)
EditText
只是可编辑的TextView
,Layout
用于测量,计算,文本的放置位置和方式。 Drawable
仅用于保持光标的外观,稍后在Canvas
上绘制。 Path
为invalidated。闪烁基本上是递归Runnable
,Handler
每隔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();
}
}