blob: 6c17fb3c9f0b55e7417e75499c4f7dc93186a8e1 [file] [log] [blame]
package com.airbnb.lottie.sample.compose.examples
import android.graphics.Typeface
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.airbnb.lottie.LottieProperty
import com.airbnb.lottie.compose.LottieAnimation
import com.airbnb.lottie.compose.LottieCompositionSpec
import com.airbnb.lottie.compose.rememberLottieComposition
import com.airbnb.lottie.compose.rememberLottieDynamicProperties
import com.airbnb.lottie.compose.rememberLottieDynamicProperty
import com.airbnb.lottie.sample.compose.R
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@Composable
fun TextExamplesPage() {
UsageExamplePageScaffold {
Column(
modifier = Modifier
.fillMaxWidth()
.verticalScroll(rememberScrollState())
) {
ExampleCard("Default", "Loading fonts using default asset paths") {
Example1()
}
ExampleCard("Dynamic Properties", "Replace fonts with custom typefaces") {
Example2()
}
}
}
}
@Composable
private fun Example1() {
// Lottie will automatically look for fonts in src/main/assets/fonts.
// It will find font files based on the font family specified in the Lottie Json file.
// You can specify a different assets subfolder by using the fontAssetsFolder parameter.
// By default, it will look for ttf files.
// You can specify a different file extension by using the fontFileExtension parameter.
val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.name))
LottieAnimation(
composition,
progress = 0f,
)
}
@Composable
private fun Example2() {
val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.name))
val typeface = rememberTypeface("fonts/Roboto.ttf")
val dynamicProperties = rememberLottieDynamicProperties(
rememberLottieDynamicProperty(LottieProperty.TYPEFACE, typeface, "NAME")
)
LottieAnimation(
composition,
progress = 0f,
dynamicProperties = dynamicProperties,
)
}
@Composable
private fun rememberTypeface(path: String): Typeface? {
var typeface: Typeface? by remember { mutableStateOf(null) }
val context = LocalContext.current
LaunchedEffect(path) {
typeface = null
withContext(Dispatchers.IO) {
typeface = Typeface.createFromAsset(context.assets, "fonts/Roboto.ttf")
}
}
return typeface
}