我正在制作自己的蒙古竖字TextView
(and EditText
)通过扩展从头开始View
。我试图了解闪烁光标是如何在Android TextView源代码 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java。它似乎是由一个处理mEditor
的实例Editor class https://android.googlesource.com/platform/frameworks/base/+/37960c7/core/java/android/widget/Editor.java。在那堂课上我发现了一个drawCursor
method:
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 https://developer.android.com/reference/android/graphics/drawable/Drawable.html某种类型的。
所以我正在寻找碎片,但我无法透过树木看到森林。有比我更了解这一点的人可以用简单的英语告诉我闪烁的光标是如何工作的吗?
以下是一些我不太明白的具体点:
- 光标与光标的关系
TextView
(or EditText
), Layout
, Editor
, and Drawable
.
- 每次光标闪烁时,是重新绘制所有文本还是仅重新绘制光标区域?
Note:
接受的答案回答了我提出的问题。然而,如果有人可以添加一个更规范的答案来更详细地解释事情,我很乐意接受不同的答案。
-
EditText
只是可编辑的TextView
, Layout
用于测量、计算以及文本的布局位置和方式。Drawable
是不是只是为了保持光标的外观,稍后在Canvas
.
- 仅光标
Path
is 无效的 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java#L5237.
闪烁基本上是递归的Runnable
that a Handler
每 500 毫秒执行一次(猜测),以开关方式执行,并且在EditText
有焦点。这也可以通过循环来实现ValueAnimator
int 类型,光标可绘制 alpha 将在 0 到 255 之间切换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)