Я пытаюсь динамически поменять местами текст внутри LottieAnimation в компоновке реактивного ранца. Файл лотереи экспортируется без глифов
Он работает при использовании старого представления Android внутри
AndroidView(factory = { context ->
val view = LottieAnimationView(context).apply {
setAnimation(R.raw.testing_no_glyphs)
playAnimation()
repeatCount = LottieConstants.IterateForever
}
val textDel = object : TextDelegate(view) {
override fun getText(layerName: String?, input: String?): String {
return when (layerName) {
"Test234" -> "OtherLettersHere"
else -> super.getText(layerName, input)
}
}
}
val fontDel = object : FontAssetDelegate() {
override fun getFontPath(fontFamily: String?, fontStyle: String?, fontName: String?): String {
return "fonts/[MyFontInside /assets].ttf"
}
}
view.setTextDelegate(textDel)
view.setFontAssetDelegate(fontDel)
return@AndroidView view
})
Но я не могу найти правильные дескрипторы в версии Lottie для JetpackCompose, чтобы получить тот же результат.
Если мы экспортируем лотерею с глифами, это работает для букв в массиве chars
внутри лотереи json. Но мы хотим иметь возможность заменять любые буквы/символы, так что это нежизнеспособное решение.
Я заметил в 5.3.0-SNAPSHOT, что был добавлен параметр fontMap
, но я не могу понять, какую клавишу с ним нажать.
Вот мой код:
val dynamicProperties = rememberLottieDynamicProperties(
rememberLottieDynamicProperty(LottieProperty.TEXT, value = "AaBbCcEeFf", keyPath = arrayOf("Test234"))
)
val composition by rememberLottieComposition(
spec = LottieCompositionSpec.RawRes(R.raw.testing)
)
val progress by animateLottieCompositionAsState(composition, iterations = LottieConstants.IterateForever)
LottieAnimation(
composition,
{ progress },
dynamicProperties = dynamicProperties,
fontMap = mapOf("fName" to Typeface.createFromAsset(LocalContext.current.assets, "fonts/[MyFontInside /assets].ttf"))
)
Он просто показывает пустое место для всех текстов внутри Lottie Animation - так что это своего рода то, где я застрял.
После проб и ошибок я нашел способ добавить шрифт для определенного слоя:
val typeface = Typeface.createFromAsset(LocalContext.current.assets, "fonts/[MyFontInside /assets].ttf")
val dynamicProperties = rememberLottieDynamicProperties(
rememberLottieDynamicProperty(LottieProperty.TEXT, value = "AaBbCcEeFf", keyPath = arrayOf("Test234")),
--> rememberLottieDynamicProperty(LottieProperty.TYPEFACE, value = typeface, keyPath = arrayOf("Test234")),
)
Следовательно, в моем случае нет необходимости в fontMap