142 lines
4.8 KiB
Kotlin
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: "
|
|
}
|
|
}
|