2015-04-30 80 views
3

我正在使用BackgroundColorSpan來突出顯示EditText中的某些文本。我遇到的問題是,如果顏色具有100%alpha並且很難用較低的alpha查看,則文本字段的光標不可見。使用BackgroundColorSpan無法看到光標

我已經做了一些挖通過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問題跟蹤創建一個bug報告如下:https://code.google.com/p/android/issues/detail?id=172001

回答

0

我最後做的解決方案是創建兩個擴展。 EditText之一,另一個BackgroundColorSpan

BackgroundColorSpan的擴展名根本不會改變TextPaint的背景顏色updateDrawState(),但它允許外部類訪問此類顏色。

EditText的擴展名查找特殊的BackgroundColorSpan,並在調用超級實現之前在onDraw()內部手動繪製背景。

此要點顯示了完整的解決方案(進口需要創建):

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

注:如果跨度保存和恢復(對例如旋轉)它沒有發揮好,可能會必須在恢復時操作跨度。