You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:27:04