blob: c044da2299ea481289d76512608b34fa8e9ee11e [file] [log] [blame]
package com.airbnb.lottie.samples
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Typeface
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import com.airbnb.lottie.FontAssetDelegate
import com.airbnb.lottie.ImageAssetDelegate
import com.airbnb.lottie.LottieComposition
import kotlinx.android.synthetic.main.activity_snapshot_tests.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
class SnapshotTestActivity : AppCompatActivity() {
private val dummyBitmap by lazy { BitmapFactory.decodeResource(resources, R.drawable.airbnb); }
private val bitmapPool = BitmapPool()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_snapshot_tests)
filmStripView.setImageAssetDelegate(ImageAssetDelegate { dummyBitmap })
filmStripView.setFontAssetDelegate(object : FontAssetDelegate() {
override fun getFontPath(fontFamily: String?): String {
return "fonts/Roboto.ttf"
}
})
@Suppress("DEPRECATION")
animationView.isDrawingCacheEnabled = false
}
fun getAnimationView() = animationView
suspend fun snapshotAnimationView(): Bitmap {
animationView.isVisible = true
filmStripView.isVisible = false
val bitmap = bitmapPool.acquire(animationView.width.coerceAtLeast(1), animationView.height.coerceAtLeast(1))
val canvas = Canvas(bitmap)
animationView.draw(canvas)
return bitmap
}
suspend fun snapshotFilmstrip(composition: LottieComposition) = suspendCoroutine<Bitmap> { continuation ->
filmStripView.post {
animationView.isVisible = false
filmStripView.isVisible = true
val bitmap = bitmapPool.acquire(filmStripView.width, filmStripView.height)
val canvas = Canvas(bitmap)
filmStripView.setComposition(composition)
filmStripView.draw(canvas)
continuation.resume(bitmap)
}
}
private class BitmapPool() {
private val bitmaps = mutableListOf<Bitmap>()
@Synchronized
fun acquire(width: Int, height: Int): Bitmap {
return bitmaps.firstOrNull { it.width == width && it.height == height } ?: Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
}
@Synchronized
fun release(bitmap: Bitmap) {
bitmaps.add(bitmap)
}
}
}