[英]Is it possible to display multi-color text with one call to Canvas.drawText()?
我想使用Canvas.drawText()來顯示多色文本。 更具體地說,我想突出顯示傳遞給drawText()方法的文本的子字符串。
文本采用具有0個或更多ForegroundColorSpan對象的SpannableString形式。
看看Canvas代碼,看來對傳遞的CharSequence進行.toString()調用意味着這是不可能的。
還有另一種方法嗎?
編輯:文本可能偶爾會更改(總更改,而不是增量)。 此外,在自定義視圖中可能存在多個位於不同不相關位置的文本。
是的,可以使用其中一個布局類。 這些是用於將文本繪制到畫布的輔助類,它們支持Spannable。 如果您的文本沒有更改,請使用StaticLayout。
例
將其添加到您的自定義視圖類
private StaticLayout layout;
將此代碼放入onLayout
或onSizeChanged
Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers");
wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextPaint paint = new TextPaint();
paint.setTextSize(20f);
paint.setColor(Color.RED);
layout = new StaticLayout(wordtoSpan, paint, getWidth(), Alignment.ALIGN_NORMAL, 1, 0, false);
然后在你的繪圖方法中簡單地調用
layout.draw(canvas);
如果您的文本經常更改,您可以使用DynamicLayout
。
Editable.Factory fac = Editable.Factory.getInstance();
Editable edit = fac.newEditable(wordtoSpan);
DynamicLayout layout = new DynamicLayout(edit,paint,getWidth(),Alignment.ALIGN_CENTER,1,0,false);
使用編輯對象更改文本
edit.append("hello");
我沒有使用Canvas。 看下面的代碼我是如何在textview中使用它的。
public TextView getTextClipArt1(){
TextView textView = new TextView(context);
Typeface tf = new MyTypeface(context, 0).getTypeface();
Shader textShader=new LinearGradient(0, 0, 0, 30,
new int[]{Color.GREEN,Color.BLUE},
new float[]{0, 1}, TileMode.CLAMP);
textView.setTypeface(tf);
textView.getPaint().setShader(textShader);
textView.getPaint().setStyle(Paint.Style.STROKE);
textView.getPaint().setStrokeWidth(2);
textView.setText("ABC");
textView.setTextSize(30);
textView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
return textView;
}
你現在可以在canvas上繪制textview作為位圖,雖然我認為這些方法也存在於paint類中。 希望對你有用。
如果您使用TextView,請嘗試這樣的操作
String multiColorText = "<font color=0xff0000>Multi</font><font color=0x000000>Color</font><font color=0xccffff>Text</font>";
textView.setText(Html.fromHtml(multiColorText));
編輯:對於SpannableString,請檢查以下內容是否對您有所幫助
Spannable WordtoSpan = new SpannableString("partial colored text");
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
無論何時為該視圖編寫該文本,都可以設置thatView.setBackgroundResource(R.drawable.multicolor); 和
在multicolor.xml中寫
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="@color/tabBgStart"
android:endColor="@color/tabBgEnd"
android:angle="270"/>
</shape>
希望它肯定會有效
要更改文本顏色,可以使用yourView.setTextColor(R.drawable.multicolor);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.