如何调用raw目录下多个动画中的任意一个?Lottie动态设置报错
崩溃根因
LottieAnimationView.setAnimation()存在多个重载:
- 传入
int类型参数时,方法会把参数识别为R类中定义的raw资源ID,直接加载对应资源,这也是你硬编码R.raw.animation2能正常运行的原因 - 传入
String类型参数时,方法会默认把参数当做assets目录下的文件路径/本地存储的文件绝对路径去查找资源,你拼接的"R.raw.animation" + randNumber并不是真实存在的文件路径,所以会触发文件找不到异常。
解决方案
这里提供两种适配不同场景的实现方式:
方案1:预定义资源数组(推荐,性能最优)
适合资源数量固定的场景(你的场景刚好符合),直接把所有动画资源ID预先存入数组,随机取数组元素加载即可:
LottieAnimationView animationView = findViewById(R.id.animationViewer); // 预存所有动画的raw资源ID int[] allAnimRes = { R.raw.animation1, R.raw.animation2, R.raw.animation3, R.raw.animation4, R.raw.animation5, R.raw.animation6, R.raw.animation7, R.raw.animation8, R.raw.animation9, R.raw.animation10 }; // 生成0-9的随机下标 int randomIndex = new Random().nextInt(allAnimRes.length); // 直接传入资源ID加载 animationView.setAnimation(allAnimRes[randomIndex]);
该方案无需动态检索资源,性能最高,不会出现资源找不到的异常。
方案2:动态获取资源ID
适合资源数量多、不想手动维护数组的场景,通过系统API动态根据资源名获取对应的资源ID:
LottieAnimationView animationView = findViewById(R.id.animationViewer); int randNumber = new Random().nextInt(10) + 1; // 三个参数分别为:资源名、资源所属类型、应用包名 int animResId = getResources().getIdentifier("animation" + randNumber, "raw", getPackageName()); if (animResId != 0) { // 获取到有效资源ID才加载 animationView.setAnimation(animResId); } else { // 资源找不到时的兜底逻辑,可自行替换为默认动画 animationView.setAnimation(R.raw.animation1); }
注意:getIdentifier找不到对应资源时会返回0,必须做有效性校验,避免传入无效ID触发崩溃。
内容的提问来源于stack exchange,提问作者Shift72
相关产品推荐
相关产品推荐

