Files
uniapp-im-shop/uni_modules/tuikit-atomic-x/utssdk/app-android/kotlin/SVGAAnimationView.kt
2026-01-12 17:52:15 +08:00

142 lines
4.8 KiB
Kotlin

package uts.sdk.modules.atomicx.kotlin
import android.content.Context
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.opensource.svgaplayer.SVGACallback
import com.opensource.svgaplayer.SVGAImageView
import com.opensource.svgaplayer.SVGAParser
import com.opensource.svgaplayer.SVGAVideoEntity
import io.dcloud.uts.console
import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.InputStream
import java.net.URL
class SVGAAnimationView(context: Context) : FrameLayout(context), SVGACallback {
private val svgaParser: SVGAParser
private val svgaImageView: SVGAImageView
private var svgaCallback: SVGACallback? = null
init {
svgaImageView = SVGAImageView(context)
val lp: FrameLayout.LayoutParams =
FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
addView(svgaImageView, lp)
svgaImageView.loops = 1
svgaImageView.callback = this
svgaParser = SVGAParser.shareParser()
svgaParser.init(context)
}
fun setCallback(callback: SVGACallback) {
svgaCallback = callback
}
// val playUrl = "/sdcard/Android/data/uni.app.UNIFA697C8/images/sports_car.svga"
fun startAnimation(playUrl: String) {
console.log("startAnimation playUrl: ", playUrl)
// Logger.e(TAG + "startAnimation, playUrl: $playUrl")
if (playUrl.isNullOrEmpty()) {
console.error("startAnimation, playUrl is empty")
// Logger.e(TAG + "startAnimation, playUrl is empty")
svgaCallback?.onFinished()
return
}
if (playUrl.endsWith(".svga") && isUrl(playUrl)) {
decodeFromURL(playUrl)
} else {
decodeFromInputStream(playUrl)
}
}
private fun isUrl(url: String): Boolean = url.startsWith("http") || url.startsWith("https")
fun stopAnimation() {
svgaImageView.stopAnimation(true)
}
private fun decodeFromURL(playUrl: String) {
console.log("decodeFromURL, playUrl: ", playUrl)
svgaParser.decodeFromURL(URL(playUrl), object : SVGAParser.ParseCompletion {
override fun onComplete(videoItem: SVGAVideoEntity) {
console.log("decodeFromURL onComplete, videoItem: ", videoItem)
// Logger.i(TAG + "startAnimation decodeFromURL, videoItem: $videoItem")
svgaImageView.setVisibility(View.VISIBLE)
svgaImageView.setVideoItem(videoItem)
svgaImageView.startAnimation()
}
override fun onError() {
console.log("===== decodeFromURL failed")
// Logger.e(TAG + "decodeFromURL failed, playUrl: $playUrl")
svgaCallback?.onFinished()
}
},)
}
private fun decodeFromInputStream(filePath: String) {
console.log("decodeFromInputStream, filePath: ", filePath)
val stream = openInputStream(filePath)
if (stream == null) {
console.log("decodeFromInputStream, filePath is null")
// Logger.e(TAG + "decodeFromInputStream failed, filePath is null")
return
}
svgaParser.decodeFromInputStream(stream, "", object : SVGAParser.ParseCompletion {
override fun onComplete(videoItem: SVGAVideoEntity) {
console.log("======startAnimation decodeFromInputStream start: ", videoItem)
// Logger.i(TAG + "decodeFromInputStream start: videoItem: $videoItem")
svgaImageView.setVisibility(VISIBLE)
svgaImageView.setVideoItem(videoItem)
svgaImageView.startAnimation()
}
override fun onError() {
console.log("======decodeFromInputStream parse failed: ", filePath)
// Logger.e(TAG + "decodeFromInputStream parse failed, filePath: $filePath")
svgaCallback?.onFinished()
}
}, true, null, "", )
}
override fun onFinished() {
console.log("SVGAAnimationView onFinished")
// Logger.i(TAG + "onFinished")
svgaImageView.setVisibility(View.GONE)
svgaCallback?.onFinished()
}
override fun onPause() {
}
override fun onRepeat() {
}
override fun onStep(frame: Int, percentage: Double) {
}
private fun openInputStream(path: String): InputStream? {
try {
val file = File(path)
if (file.exists()) {
return FileInputStream(file)
}
} catch (e: FileNotFoundException) {
Log.i(TAG, " " + e.localizedMessage)
}
return null
}
companion object {
private const val TAG = "UTS-SVGAAnimationView: "
}
}