10

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

文本采用 SpannableString 的形式,其中包含 0 个或多个 ForegroundColorSpan 对象。

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

有替代方法吗?

编辑:文本可能偶尔会发生变化(全部变化,而不是增量)。此外,自定义视图中可能有多个文本位于不同的不相关位置。

4

4 回答 4

28

是的,可以使用Layout类之一。这些是用于将文本绘制到画布的辅助类,它们支持 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");
于 2012-05-02T09:16:10.787 回答
1

每当您为该视图编写该文本时,您都可以设置 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);

于 2012-05-02T09:27:51.493 回答
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;
}

您现在可以在画布上将 textview 绘制为位图,尽管我认为这些方法也存在于绘画类中。希望对你有用。

于 2012-05-02T10:29:25.597 回答
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);
于 2012-05-02T09:06:15.890 回答