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

使用ExoPlayer播放媒体时Animation List动画无法启动的问题求助

ExoPlayer 搭配 AnimationDrawable 实现轮播图的问题解决

变量声明位置

直接在 Activity 中声明为 private lateinit var 即可,不要用伴生对象——静态变量会和视图生命周期冲突,容易引发异常:

private lateinit var sequenceAnimation: AnimationDrawable

动画启动的正确时机

不能在 onCreate 里直接调用 start(),此时 ImageView 还未完成绘制,AnimationDrawable 还没绑定到视图上。推荐两种可靠的启动方式:

方式一:利用 ImageView 的 post 方法

在视图绘制完成后再启动动画,确保资源已加载:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_player)
    
    // 初始化 ExoPlayer 逻辑...
    
    val carouselImageView = findViewById<ImageView>(R.id.carousel_image)
    // 注意是设置背景,不是前景图片
    carouselImageView.setBackgroundResource(R.drawable.your_animation_list)
    sequenceAnimation = carouselImageView.background as AnimationDrawable
    
    // 视图绘制完成后启动动画
    carouselImageView.post {
        sequenceAnimation.start()
    }
}

方式二:重写 onWindowFocusChanged

当页面获取焦点时启动动画,适合需要页面可见就播放的场景:

override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if (hasFocus && ::sequenceAnimation.isInitialized) {
        sequenceAnimation.start()
    }
}

排查视频列表跳转异常问题

你之前遇到的「视频列表不显示、直接跳播放器」问题,大概率是动画初始化时的异常导致跳转逻辑出错,检查以下几点:

  • 确认动画资源文件格式正确,your_animation_list.xml 必须包含循环标记和每个帧的时长:
    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false"> <!-- false 表示循环播放 -->
        <item android:drawable="@drawable/img_slide_1" android:duration="2500"/>
        <item android:drawable="@drawable/img_slide_2" android:duration="2500"/>
        <item android:drawable="@drawable/img_slide_3" android:duration="2500"/>
    </animation-list>
    
  • 必须用 setBackgroundResource 设置动画资源,不要用 setImageResource——AnimationDrawable 是作为背景层工作的。
  • 检查列表页面代码,有没有误触发播放器页面的跳转逻辑(比如提前初始化了播放器相关代码导致异常跳转)。

生命周期优化

为避免后台耗电,记得在 Activity 生命周期中管理动画状态:

override fun onPause() {
    super.onPause()
    if (::sequenceAnimation.isInitialized && sequenceAnimation.isRunning) {
        sequenceAnimation.stop()
    }
}

override fun onResume() {
    super.onResume()
    if (::sequenceAnimation.isInitialized && !sequenceAnimation.isRunning) {
        sequenceAnimation.start()
    }
}

内容的提问来源于stack exchange,提问作者joaco bona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:50:45