1. ホーム
  2. android

カスタム書体でTypefaceSpanやStyleSpanを使用するにはどうしたらいいですか?

2023-10-12 10:41:56

質問

このような方法が見当たりません。可能でしょうか?

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

notme は本質的に正しい考えを持っていますが、与えられた解決策は "family" が冗長になるため、少しハチャメチャです。また、TypefaceSpan は Android が知っている特別なスパンの 1 つであり、ParcelableSpan インターフェイス (notme のサブクラスは適切に実装されておらず、実装することも不可能) に関して特定の動作を期待するため、若干不正確です。

よりシンプルでより正確な解決策は

public class CustomTypefaceSpan extends MetricAffectingSpan
{
    private final Typeface typeface;

    public CustomTypefaceSpan(final Typeface typeface)
    {
        this.typeface = typeface;
    }

    @Override
    public void updateDrawState(final TextPaint drawState)
    {
        apply(drawState);
    }

    @Override
    public void updateMeasureState(final TextPaint paint)
    {
        apply(paint);
    }

    private void apply(final Paint paint)
    {
        final Typeface oldTypeface = paint.getTypeface();
        final int oldStyle = oldTypeface != null ? oldTypeface.getStyle() : 0;
        final int fakeStyle = oldStyle & ~typeface.getStyle();

        if ((fakeStyle & Typeface.BOLD) != 0)
        {
            paint.setFakeBoldText(true);
        }

        if ((fakeStyle & Typeface.ITALIC) != 0)
        {
            paint.setTextSkewX(-0.25f);
        }

        paint.setTypeface(typeface);
    }
}