Создать TypeFaceSpan из TypeFace ниже SDK версии 28
Я нашел способ create
TypeFaceSpan
от 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()