首页云计算Lottie动画资源放到服务器预下载

Lottie动画资源放到服务器预下载

时间2024-07-29 04:58:25发布ongwu分类云计算浏览51

object FileDownloadConstant {

const val filePath = “gifts/zIP

//下载下来的资源存放的根目录

var DEFAULT_FILE_CACHE_PATH = ContextUtils.getApplicationContext().getExternalFilesDir(“gift”).path

//礼物动画存储目录

var rootPathAnimation = “ D E F A U L T F I L E C A C H E P A T H / {DEFAULT_FILE_CACHE_PATH}/ DEFAULTFILECACHEPATH/{filePath}”

object BaseConfig{

//资源存放的apk地址

const val ANIMATION_OSS_URL = “https://static.network.com”

const val GIFT_PATH = “ A N I M A T I O N O S S U R L / {ANIMATION_OSS_URL}/ ANIMATIONOSSURL/

{filePath}”

}

//资源列表

var giftList = listOf(“xiagujian”,“chiji”,“kele”,“banzhuan”,“memeda”,“qiujiaowang”,“qiqiu”,“penghua”,

“yanhua”,“meigui”,“feiji”,“chengbao”,“bixin”,“loveyou”,“sobuteful”,“hongchun”,“girlfri”,“huangguan”,

“leihen”,“qiubite”,“haozhuchi”,“zhuguang”,“langman”,“bidong”,“dangao”,“laohu”,“mao”,“xiong”,“hunsha”,

“dianzan”,“bangbangtang”,“icecream”,“yiwendingqing”,“haidao”,“IPhone”,“yecanyuehui”,“lovetree”,“jiarilvxing”)

}

文件下载工具

/**

文件下载工具

*/

object FileDownloadUtil {

private val parentPath = FileDownloadConstant.rootPathAnimation

private val fetch = Fetch.getInstance(FetchConfiguration.Builder(ContextUtils.getApplicationContext())

.setLogger(FetchLogger(true,“动画下载”))

.enableLogging(true)

.setDownloadConcurrentLimit(5)

.setAutoRetryMaxAttempts(3)

.setHttpDownloader(OkHttpDownloader(Downloader.FileDownloaderType.PARALLEL))

.setProgressReportingInterval(1000)

.build())

/**

下载监听

*/

class DownloadListener(private val groupId : Int,private val num:Int,private val callback 😦(Boolean) -> Unit) ?) : AbstractFetchListener(){

private var downloaded: Int = 0 //已下载的数量

override fun onCompleted(download: Download) {

if (download.group != groupId) {

return

}

//资源打包成zIP文件放到了服务器上,所以下载下来要解压缩

LottieAnimationUtils.unZIP(download.file, parentPath)

downloadCount(true)

}

override fun onError(download: Download, error: Error, throwable: Throwable?) {

if (download.group != groupId) {

return

}

downloadCount(false)

}

private val downloadCount: (Boolean) -> Unit = {

downloaded++

if (downloaded == num) {

callback?.invoke(it)

fetch.removeListener(this)

}

}

}

fun downloadList(pathList: List, priority: Priority = Priority.NORMAL, callback: ((Boolean) -> Unit)? = null) {

val groupId = Random.nextInt()

pathList.filter {

//本地文件不存在的才下载

!File(parentPath + File.separator + it).exists()

}.flatMap { path ->

arrayListOf(Request(“ F i l e D o w n l o a d C o n s t a n t . B a s e C o n f i g . G I F T P A T H / {FileDownloadConstant.BaseConfig.GIFT_PATH}/ FileDownloadConstant.BaseConfig.GIFTPATH/

path” + “.zIP”, parentPath + “/” + path + “.zIP”).also {

it.groupId = groupId

it.priority = priority

})

}.apply {

if (size == 0) {

callback?.invoke(true)

return@apply

}

fetch.addListener(DownloadListener(groupId, size, callback)).enqueue(this)

}

}

/**

下载单个文件

*/

fun download(path: String, callback: ((Boolean) -> Unit)? = null) {

if (File(“ p a r e n t P a t h / parentPath/ parentPath/

path” + “.zIP”).exists()) {

callback?.invoke(true)

return

}

val groupId = Random.nextInt()

fetch.addListener(DownloadListener(groupId, 1, callback)).enqueue(Request(“ F i l e D o w n l o a d C o n s t a n t . B a s e C o n f i g . G I F T P A T H / {FileDownloadConstant.BaseConfig.GIFT_PATH}/ FileDownloadConstant.BaseConfig.GIFTPATH/path” + “.zIP”, “ p a r e n t P a t h / parentPath/ parentPath/

path.zIP”).also { it.groupId = groupId })

}

}

下载框架使用的是一个开源的,名字叫Fetch

在启动页的onCreate方法中,调用:

FileDownloadUtil.INSTANCE.downloadList(FileDownloadConstant.INSTANCE.getGiftList(), Priority.NORMAL,null);

就开始下载资源

那么怎么使用Lottie框架加载文件夹中的动画资源呢?直接上代码

object LottieAnimationUtils {

//lottie加载本地资源的核心方法

fun loadLottie(lottieAnimationView: LottieAnimationView,imagePath:String,dataPath : String,giftName:String):FileInputStream?{

lottieAnimationView.setCacheComposition(false)

val imageFiles = File(imagePath)

val jsonFile = File(dataPath)

var fis:FileInputStream? = null

//资源中只有json文件的时候走这里

if (!imageFiles.exists()) {

if (jsonFile.exists()) {

fis = FileInputStream(jsonFile)

try {

lottieAnimationView.setImageAssetDelegate(null)

}catch (e : Exception) {

}

LottieComposition.Factory.fromInputStream(fis) {

lottieAnimationView.postDelayed(Runnable {

lottieAnimationView.visibility = View.VISIBLE

},200)

it?.let {

it1 -> lottieAnimationView.setComposition(it1)

}

lottieAnimationView.playAnimation()

}

}else {

FileDownloadUtil.download(giftName)

}

return fis

}

//资源中有imges和json的走这里 结尾

我还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家。

(包括Java在Android开发应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发音视频技术人工智能技术,跨平台技术技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码点击传送门,即可获取! 搜索资料的时间来学习。**

[外链图片转存中…(img-NGrXGGWu-1714771521859)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码点击传送门,即可获取!

Ongwu博客 版权声明:以上内容未经允许不得转载!授权事宜或对内容有异议或投诉,请联系站长,将尽快回复您,谢谢合作!

展开全文READ MORE
戴尔poweredge r720服务器raid配置及centos6,冲刺7天拿下Offer 穿越虚拟界限:Transformer模型在虚拟现实中的独特应用

游客 回复需填写必要信息