Android Studio中AnimatedVectorDrawable表现异常问题排查
问题原因分析及解决方案
核心错误点
- RadioButton监听逻辑未判断选中状态:每个
RadioButton的OnCheckedChangeListener会在选中和取消选中时都触发回调,你当前的代码没有判断isChecked的真假,导致取消选中旧按钮时,依然执行了显示对勾、启动动画的逻辑,这就是切换时旧按钮乱触发动画的根本原因。 - 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
相关产品推荐
相关产品推荐

