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

Mar*_*ark 8 android android-canvas

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

文本采用具有0个或更多ForegroundColorSpan对象的SpannableString形式.

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

还有另一种方法吗?

编辑:文本可能偶尔会更改(总更改,而不是增量).此外,在自定义视图中可能存在多个位于不同不相关位置的文本.

Ren*_*ard 28

是的,可以使用其中一个布局类.这些是用于将文本绘制到画布的辅助类,它们支持Spannable.如果您的文本没有更改,请使用StaticLayout.

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

private StaticLayout layout;
Run Code Online (Sandbox Code Playgroud)

将此代码放入您的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);
Run Code Online (Sandbox Code Playgroud)

然后在你的绘图方法中简单地调用

layout.draw(canvas);
Run Code Online (Sandbox Code Playgroud)

如果您的文本经常更改,您可以使用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);
Run Code Online (Sandbox Code Playgroud)

使用编辑对象更改文本

edit.append("hello");
Run Code Online (Sandbox Code Playgroud)