是否可以通过一次调用Canvas.drawText()来显示多色文本?

我想用Canvas.drawText()来显示多色文字。 更具体地说,我想突出传递给drawText()方法的文本的子string。

该文本的forms为具有0个或更多ForegroundColorSpan对象的SpannableString。

看看Canvas代码,看起来传递的CharSequence上的.toString()调用意味着这是不可能的。

有其他的方法吗?

编辑:文本可能会偶尔改变(总变化,而不是增量)。 而且,在自定义视图中可能有多个文本位于不同的不相关位置。

Solutions Collecting From Web of "是否可以通过一次调用Canvas.drawText()来显示多色文本?"

是的,可以使用其中一个布局类。 这些是用于将文本绘制到canvas的辅助类,它们支持Spannables。 如果你的文本不改变使用StaticLayout。

将此添加到您的自定义视图类

private StaticLayout layout; 

把这个代码放到你的onLayoutonSizeChanged

 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作为位图来绘制,尽pipe我认为这些方法也存在于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); 

每当你为那个视图写文本时,你可以设置View.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> 

希望它能起作用

要改变文字颜色,你可以使用你的View.setTextColor(R.drawable.multicolor);