web-dev-qa-db-ja.com

異なるストロークと塗りつぶしの色でテキストを描く方法は?

アプリに以下のようなテキストを表示したい。私はこれを達成するためにPaintクラスをスタイル_FILL_AND_STROKE_で使用しています。ただし、色を設定するために使用できるメソッドsetColor()は1つだけです。

異なるストロークと塗りつぶしの色を設定するにはどうすればよいですか?

text with different stroke and fill colors

26
Yugandhar Babu

カスタムTextView内(EditTextでは機能しません):

@Override
public void onDraw(Canvas canvas)
{
    final ColorStateList textColor = getTextColors();

    TextPaint Paint = this.getPaint();

    Paint.setStyle(Style.STROKE);
    Paint.setStrokeJoin(Join.ROUND);
    Paint.setStrokeMiter(10);
    this.setTextColor(strokeColor);
    Paint.setStrokeWidth(strokeWidth);

    super.onDraw(canvas);
    Paint.setStyle(Style.FILL);

    setTextColor(textColor);
    super.onDraw(canvas);
}

FILL_AND_STROKEは使用しないでください。 FILLで1回描画し、次に色を変更して、STROKEで描画します。

(これは四角形で機能します。STROKEがテキストでまったく機能しないかどうかはわかりません。実際に試して調べる必要があります。)

17
Reuben Scratton

上記の最初の解決策を使用して、このアイデアを思い付きました。より大きなSTROKEのテキストを配置し、それを小さなFILL_AND_STROKEテキストでオーバーレイします。

mScorePaint = new TextPaint();
mScorePaint.setTextSize(63);
mScorePaint.setStyle(Style.STROKE);
mScorePaint.setStrokeJoin(Join.ROUND);
mScorePaint.setStrokeMiter(10.0f);
mScorePaint.setStrokeWidth(frameWidth/50.0f); // about 12
mScorePaint.setColor(0xffff0000); // black

c.drawText(Integer.toString(mScore), x, y, mScorePaint);  // red first

mScorePaint.setStrokeWidth(frameWidth/125.0f); // about 5
mScorePaint.setColor(0xff000000); // red

c.drawText(Integer.toString(mScore), x, y, mScorePaint);  // black on top

FILLだけではストローク属性がまったく表示されず、非常に薄くなっていたからです。

0
Amy McBlane

完全にはわかりませんが、多分これを使用できます:

リンク

 TextView test = (TextView) findViewById(R.id.test);

 test.setShadowLayer(float, float, float, int);
0
FabianCook