簡體   English   中英

是否可以通過一次調用Canvas.drawText()來顯示多色文本?

[英]Is it possible to display multi-color text with one call to Canvas.drawText()?

我想使用Canvas.drawText()來顯示多色文本。 更具體地說,我想突出顯示傳遞給drawText()方法的文本的子字符串。

文本采用具有0個或更多ForegroundColorSpan對象的SpannableString形式。

看看Canvas代碼,看來對傳遞的CharSequence進行.toString()調用意味着這是不可能的。

還有另一種方法嗎?

編輯:文本可能偶爾會更改(總更改,而不是增量)。 此外,在自定義視圖中可能存在多個位於不同不相關位置的文本。

是的,可以使用其中一個布局類。 這些是用於將文本繪制到畫布的輔助類,它們支持Spannable。 如果您的文本沒有更改,請使用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作為位圖,雖然我認為這些方法也存在於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);

無論何時為該視圖編寫該文本,都可以設置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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM