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

Android Studio中AnimatedVectorDrawable表现异常问题排查

问题原因分析及解决方案

核心错误点

  1. RadioButton监听逻辑未判断选中状态:每个RadioButton的OnCheckedChangeListener会在选中和取消选中时都触发回调,你当前的代码没有判断isChecked的真假,导致取消选中旧按钮时,依然执行了显示对勾、启动动画的逻辑,这就是切换时旧按钮乱触发动画的根本原因。
  2. AnimatedVectorDrawable状态残留:复用同一个AnimatedVectorDrawable实例时,未重置动画状态,导致再次启动时无法回到初始位置,出现动画错乱。

修正后的代码实现

推荐改用RadioGroup的统一监听来处理单选逻辑,同时每次创建新的动画实例避免状态残留:

private lateinit var radioGroup: RadioGroup
private lateinit var rb_1_checked: ImageView
private lateinit var rb_2_checked: ImageView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.mylayout)
    
    radioGroup = findViewById(R.id.radio_group_id)
    rb_1_checked = findViewById(R.id.IV_1_id)
    rb_2_checked = findViewById(R.id.IV_2_id)
    
    // 初始隐藏所有对勾
    rb_1_checked.isVisible = false
    rb_2_checked.isVisible = false
    
    radioGroup.setOnCheckedChangeListener { group, checkedId ->
        // 先统一隐藏所有对勾,避免状态混乱
        rb_1_checked.isVisible = false
        rb_2_checked.isVisible = false
        
        when (checkedId) {
            R.id.rb_1_id -> {
                rb_1_checked.isVisible = true
                // 每次创建新的动画实例,确保从初始状态启动
                val avd = AppCompatResources.getDrawable(this, R.drawable.avd_done) as AnimatedVectorDrawable
                rb_1_checked.setImageDrawable(avd)
                avd.start()
            }
            R.id.rb_2_id -> {
                rb_2_checked.isVisible = true
                val avd = AppCompatResources.getDrawable(this, R.drawable.avd_done) as AnimatedVectorDrawable
                rb_2_checked.setImageDrawable(avd)
                avd.start()
            }
        }
    }
}

可选优化(复用动画实例)

如果不想每次创建新实例,可通过reset()方法重置动画状态后再启动:

private lateinit var radioGroup: RadioGroup
private lateinit var rb_1_checked: ImageView
private lateinit var rb_2_checked: ImageView
private var rb1Avd: AnimatedVectorDrawable? = null
private var rb2Avd: AnimatedVectorDrawable? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.mylayout)
    
    radioGroup = findViewById(R.id.radio_group_id)
    rb_1_checked = findViewById(R.id.IV_1_id)
    rb_2_checked = findViewById(R.id.IV_2_id)
    
    rb1Avd = AppCompatResources.getDrawable(this, R.drawable.avd_done) as AnimatedVectorDrawable
    rb2Avd = AppCompatResources.getDrawable(this, R.drawable.avd_done) as AnimatedVectorDrawable
    
    rb_1_checked.isVisible = false
    rb_2_checked.isVisible = false
    
    radioGroup.setOnCheckedChangeListener { group, checkedId ->
        rb_1_checked.isVisible = false
        rb_2_checked.isVisible = false
        
        when (checkedId) {
            R.id.rb_1_id -> {
                rb_1_checked.isVisible = true
                rb1Avd?.apply {
                    reset() // 重置动画到初始状态
                    rb_1_checked.setImageDrawable(this)
                    start()
                }
            }
            R.id.rb_2_id -> {
                rb_2_checked.isVisible = true
                rb2Avd?.apply {
                    reset()
                    rb_2_checked.setImageDrawable(this)
                    start()
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:15:04