SVGA源码解析

SVGA源码解析

数据解析-SVGAParser

主要是decodeFromInputStream方法,读取解析来自URL的svga文件,并缓存成本地文件

fun decodeFromInputStream(
            inputStream: InputStream,
            cacheKey: String,
            callback: ParseCompletion?
    ) {
   
        threadPoolExecutor.execute {
   
            try {
   
                readAsBytes(inputStream)?.let {
    bytes ->
                    threadPoolExecutor.execute {
   
                        // 缓存成本地文件,这边就延伸一个问题,不会默认缓存到内存,每次都需要重新load
                        SVGACache.buildSvgaFile(cacheKey).let {
    cacheFile ->
                            cacheFile.takeIf {
    !it.exists() }?.createNewFile()
                            FileOutputStream(cacheFile).write(bytes)
                        }
                    }
                    //  protobuf 解析成SVGAVideoEntity
                    inflate(bytes)?.let {
    inflateBytes ->
                        val videoItem = SVGAVideoEntity(
                                MovieEntity.ADAPTER.decode(inflateBytes),
                                File(cacheKey),
                                mFrameWidth,
                                mFrameHeight
                        )
                    }
                }
            }
    }

动画实体类-SVGAVideoEntity

看一下SVGAVideoEntity的属性和构造

    var antiAlias = true  //抗锯齿
    var movieItem: MovieEntity? = null // 解析方法传进来的MovieEntity

    var videoSize = SVGARect(0.0, 0.0, 0.0, 0.0) // 播放大小
        private set

    var FPS = 15 // 设置fps,帧率
        private set

    var frames: Int = 0 //frame的个数
        private set

    internal var spriteList: List<SVGAVideoSpriteEntity> = emptyList() // 每一帧的信息集合
    internal var imageMap = HashMap<String, Bitmap>() // Bitmap缓存,每一帧绘制可以重复利用

    constructor(entity: MovieEntity, cacheDir: File, frameWidth: Int, frameHeight: Int) {
   
        this.mFrameWidth = frameWidth
        this.mFrameHeight = frameHeight
        this.mCacheDir = cacheDir
        this.movieItem = entity
        entity.params?.let(this::setupByMovie)
        try {
   
            // 解析图片并且缓存到map中
            parserImages(entity)
        } catch (e: Exception) {
   
            e.printStackTrace()
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值