我想使用Canvas.drawText()来显示多色文本。更具体地说,我想突出显示传递给drawText()方法的文本的子字符串。
文本采用具有0个或更多ForegroundColorSpan对象的SpannableString形式。
查看Canvas代码,看来对传递的CharSequence调用.toString()意味着这是不可能的。
还有另一种方法吗?
编辑:文本可能偶尔会发生变化(总变化,而非增量变化)。此外,在自定义视图中可能有多个文本位于不同的不相关位置。
答案 0 :(得分:28)
是的,可以使用其中一个Layout类。这些是用于将文本绘制到画布的辅助类,它们支持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");
答案 1 :(得分:1)
我没有使用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类中。 希望对你有用。
答案 2 :(得分:0)
如果使用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);
答案 3 :(得分:0)
每当你为该视图编写该文本时,你可以设置 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);