我正在使用BackgroundColorSpan
突出显示EditText
中的某些文字。我遇到的问题是,如果颜色具有100%的alpha并且很难看到较低的alpha值,则文本字段的光标不可见。
我已经完成了一些挖掘EditText
和Editor
的代码(用于绘制EditText
中的文字),我发现在Editor.onDraw(...)
内光标在布局之前绘制(然后绘制文本):
if (highlight != null && selectionStart == selectionEnd && mCursorCount > 0) {
>> drawCursor(canvas, cursorOffsetVertical);
// Rely on the drawable entirely, do not draw the cursor line.
// Has to be done after the IMM related code above which relies on the highlight.
highlight = null;
}
if (mTextView.canHaveDisplayList() && canvas.isHardwareAccelerated()) {
drawHardwareAccelerated(canvas, layout, highlight, highlightPaint,
cursorOffsetVertical);
} else {
>> layout.draw(canvas, highlight, highlightPaint, cursorOffsetVertical);
}
有谁知道我该如何扭转这种行为?我现在能想到的唯一选择是自己画光标还是做一些反思巫术。两者似乎都有点矫枉过正。
更新
我已在Android问题跟踪器上为此创建了错误报告:https://code.google.com/p/android/issues/detail?id=172001
答案 0 :(得分:0)
我最终做的解决方案是创建两个扩展。 EditText之一和BackgroundColorSpan
的另一个。
BackgroundColorSpan
的扩展名不会改变TextPaint
中updateDrawState()
的背景颜色,但它允许外部类访问此类颜色。
EditText的扩展名会查找特殊BackgroundColorSpan
并在调用超级实现之前在onDraw()
内手动绘制背景。
这个要点显示了完整的解决方案(需要创建导入):
https://gist.github.com/pablisco/d9dc57cc2e9dc85d24de
注意:如果保存并恢复范围(例如在旋转时),则播放效果不佳,因此在恢复时可能需要操纵范围。