Создать TypeFaceSpan из TypeFace ниже SDK версии 28

Я нашел способ createTypeFaceSpan от TypeFace как это:

fun getTypeFaceSpan(typeFace:TypeFace) = TypeFaceSpan(typeFace)

Но этот API разрешен только на уровне API> = 28. Любой Compat libray для достижения этого ниже 28?

2 ответа

Решение

TypeFaceSpan это MetricAffectingSpan, Так что даже если нет точного способа получить TypeFaceSpan от Span, мы можем сделать CustomTypeFaceSpan как ниже и использовать его вместо TypeFaceSpan,

class CustomTypefaceSpan(private val typeface: Typeface?) : MetricAffectingSpan() {
    override fun updateDrawState(paint: TextPaint) {
        paint.typeface = typeface
    }

    override fun updateMeasureState(paint: TextPaint) {
        paint.typeface = typeface
    }
}

И используйте это так:

val typeFaceSpan = CustomTypefaceSpan(typeface)

Вдохновленный ответом @erluxman и в сочетании с функциями расширения Kotlin:

      fun Typeface.getTypefaceSpan(): MetricAffectingSpan {
    return if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.P) typefaceSpanCompatV28(this) else CustomTypefaceSpan(this)
}

@TargetApi(Build.VERSION_CODES.P)
private fun typefaceSpanCompatV28(typeface: Typeface) =
    TypefaceSpan(typeface)


private class CustomTypefaceSpan(private val typeface: Typeface?) : MetricAffectingSpan() {
    override fun updateDrawState(paint: TextPaint) {
        paint.typeface = typeface
    }

    override fun updateMeasureState(paint: TextPaint) {
        paint.typeface = typeface
    }
}

то вы можете использовать его следующим образом:

      typeface.getTypefaceSpan()
Другие вопросы по тегам