我想畫一個SpannedString
爲Canvas
。如何在Android中使用Canvas.drawText繪製一個Spanned字符串
SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 1, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
上面的例子是使用TextView
,這反過來使用Layout
繪製文本與跨度繪製。我知道using a Layout
is the recommended way將文本繪製到畫布上。不過,我正在從頭開始自己的文本佈局,所以我需要自己實現這一點。
做這樣的事情不工作
canvas.drawText(spannableString, 0, spannableString.length(), 0, 0, mTextPaint);
因爲drawText
只能從spannableString
獲取文本,沒有任何的跨度。繪圖顏色由TextPaint
單獨處理。
如何使用canvas.drawText
(或drawTextRun
)繪製跨度信息(特別是前景色和背景色)?
相關
- How to loop through the spans in a SpannedString or SpannableString in Android
- Is it possible to display multi-color text with one call to Canvas.drawText()?
計劃的解決方案
我要直接做一個自我的答案,但這個是談到了差異更大比我想象的要困難。所以我會先發帖,然後每當我能弄明白的時候添加一個答案。 (我當然會歡迎任何搶先回答。)
下面是我到目前爲止的作品:
- Draw each span range as a separate text run
- 使用
drawTextRun
繪製文本(examples)(更新 :直到API 23時才添加) - 使用
getRunAdvance
來測量從何處開始下一次文本運行(更新:未添加到API 23,請使用改爲) - 背景顏色可能需要單獨繪製(使用
drawRect
或者drawPath
?見here,here和here。) - 源代碼
TextView
,StaticLayout
和TextLine
那麼'Layout#draw'實際上有什麼問題? – pskink
@pskink,標準'佈局'只處理LTR和RTL水平文本。我正在爲[傳統蒙古語](http://stackoverflow.com/q/29739720/3681880)製作垂直文本佈局。我試過在過去的各個[佈局黑客(http://stackoverflow.com/a/29739721/3681880),但即使是那些不允許我旋轉的表情符號或CJK字符。所以我從頭開始。 [I有基本的佈局的功能結束](https://github.com/suragch/mongol-library/blob/master/mongol-library/src/main/java/net/studymongolian/mongollibrary/MongolLayout.java);現在我需要支持spanned文本。 – Suragch
好吧,現在我看到它不是一個「正常」的'你好世界'你在你的圖片 – pskink