是否有可能通过一次调用显示多色文字Canvas.drawText()?有可能、多色、文字、drawText

2023-09-05 04:51:49 作者:走着走着就散了

我想用Canvas.drawText(),以显示多彩色文本。更具体地讲,我想强调传递到的drawText()方法的文本字符串。

I would like to use Canvas.drawText() to display multi-color text. More specifically, I want to highlight a substring of the text passed to the drawText() method.

的文本是与0以上ForegroundColorSpan对象SpannableString的形式

The text is in the form of a SpannableString with 0 or more ForegroundColorSpan objects.

综观画布code,看来在传递的CharSequence一个的ToString()调用,这意味着这是不可能的。

Looking at the Canvas code, it appears that a .toString() call on the passed CharSequence, means that this is not possible.

是否有其他办法吗?

编辑:文有时可能会改变(总变化,而不是增量)。另外,还有一些定位于自定义视图中的不同位置无关潜在的多个文本。

The text may occasionally change (total changes, not incremental). Also, there are potentially multiple texts positioned in different unrelated locations in the custom view.

推荐答案

是的,它是可以通过使用的布局类。这些都是辅助类的绘制文本到画布上,他们支持Spannables。如果你的文本不会更改使用StaticLayout。

Yes it is possible by using one of the Layout classes. These are helper classes for drawing text to a canvas and they support Spannables. If your text doesn't change use a StaticLayout.

示例

添加到您的自定义视图类

Add this to your custom view class

private StaticLayout layout;

把这个code到 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);

然后在您的绘图方法只需拨打

Then in your drawing method simply call

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);

通过编辑对象更改文本

change text by using the edit object

    edit.append("hello");
 
精彩推荐
图片推荐