10

Canvas.drawText() を使用してマルチカラー テキストを表示したいと思います。具体的には、drawText() メソッドに渡されたテキストの部分文字列を強調表示したいと考えています。

テキストは、0 個以上の ForegroundColorSpan オブジェクトを持つ SpannableString の形式です。

Canvas コードを見ると、渡された CharSequence での .toString() 呼び出しは、これが不可能であることを意味しているようです。

別の方法はありますか?

編集: テキストは時折変更される場合があります (全体的な変更であり、増分ではありません)。また、カスタム ビュー内の関連のない別の場所に複数のテキストが配置されている可能性があります。

4

4 に答える 4

28

はい、Layoutクラスの 1 つを使用することで可能です。これらはキャンバスにテキストを描画するためのヘルパー クラスであり、スパンナブルをサポートしています。テキストが変わらない場合は、StaticLayout を使用してください。

これをカスタム ビュー クラスに追加します。

private StaticLayout layout;

このコードをあなたの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);

次に、描画メソッドで呼び出すだけです

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

私はキャンバスで使用されていません。以下のコードをテキストビューでどのように使用したかを参照してください。

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

テキストビューをキャンバスにビットマップとして描画できるようになりましたが、これらのメソッドはペイントクラスにも存在すると思います。あなたに役立つことを願っています。

于 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 に答える