1. ホーム
  2. android

Androidでグラデーション付きテキストを表示する

2023-08-28 22:06:32

質問

どのようにすれば TextView を拡張して、グラデーション効果のあるテキストを描画できるようにするにはどうしたらよいでしょうか。

どのように解決するのですか?

TextViewを拡張して、テキストをグラデーションで描画することはできないようです。しかし、キャンバスを作成し、そこに描画することでこの効果を得ることができます。まず でカスタム UI 要素を宣言します。 . のサブクラスを作成する必要があります。 レイアウト . この場合 ボーリングレイアウト を使用します。

Shader textShader=new LinearGradient(0, 0, 0, 20,
    new int[]{bottom,top},
    new float[]{0, 1}, TileMode.CLAMP);//Assumes bottom and top are colors defined above
textPaint.setTextSize(textSize);
textPaint.setShader(textShader);
BoringLayout.Metrics boringMetrics=BoringLayout.isBoring(text, textPaint);
boringLayout=new BoringLayout(text, textPaint, 0, Layout.Alignment.ALIGN_CENTER,
            0.0f, 0.0f, boringMetrics, false);

次に onMeasureonDraw :

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    setMeasuredDimension((int) textPaint.measureText(text), (int) textPaint.getFontSpacing());
}

@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);
    boringLayout.draw(canvas);
}

私たちの実装では onDraw の実装はこの時点ではかなりいい加減なものですが(計測の仕様を完全に無視しています!)、ビューに十分なスペースが与えられていることを保証する限りは、問題なく動作するはずです。

別の方法として、このメソッドは Canvas をオーバーライドして onPaint メソッドをオーバーライドします。このようにすると、残念ながら描画されるテキストのアンカーは常に下に来るので -textPaint.getFontMetricsInt().ascent() をy座標に追加する必要があります。