使用BackgroundColorSpan不可见光标

时间:2015-04-30 16:43:24

标签: java android android-edittext

我正在使用BackgroundColorSpan突出显示EditText中的某些文字。我遇到的问题是,如果颜色具有100%的alpha并且很难看到较低的alpha值,则文本字段的光标不可见。

我已经完成了一些挖掘EditTextEditor的代码(用于绘制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

1 个答案:

答案 0 :(得分:0)

我最终做的解决方案是创建两个扩展。 EditText之一和BackgroundColorSpan的另一个。

BackgroundColorSpan的扩展名不会改变TextPaintupdateDrawState()的背景颜色,但它允许外部类访问此类颜色。

EditText的扩展名会查找特殊BackgroundColorSpan并在调用超级实现之前在onDraw()内手动绘制背景。

这个要点显示了完整的解决方案(需要创建导入):

https://gist.github.com/pablisco/d9dc57cc2e9dc85d24de

注意:如果保存并恢复范围(例如在旋转时),则播放效果不佳,因此在恢复时可能需要操纵范围。