Android Emulator及真机checkbox/radio button UI显示异常问题
问题成因
该异常是AndroidX AppCompat/Material组件库在API 25及以下系统版本的已知兼容缺陷,并非模拟器独有问题,也和动画状态冻结无关:
- AppCompat从1.2.x版本开始,默认给
CheckBox、RadioButton实现了选中/取消选中的过渡动画,动画效果基于AnimatedStateListDrawable实现 - API 23、24版本的系统原生Drawable渲染层存在状态缓存bug:当控件状态切换过程中触发视图重绘、视图树刷新时,动画的中间过渡帧会被错误标记为控件的固定显示状态,不会随着动画结束自动清理,最终出现2种基础状态之外的多种异常显示效果
- Layout Inspector中显示正常,是因为该工具抓取的是控件的逻辑属性状态,而非屏幕上渲染的Drawable缓存帧,不会读取到错误缓存的中间帧;API 28及以上版本系统修复了原生Drawable的缓存逻辑,因此不会复现该问题。
解决方案
按推荐优先级排序:
- 优先升级项目的AndroidX AppCompat、Material组件依赖到1.4.0及以上稳定版本,官方已经在库层做了低版本兼容适配,修复了动画帧错误缓存的问题,无需修改业务侧控件代码即可解决
- 若暂时无法升级依赖版本,可手动关闭控件的状态切换动画:
单控件适配时,可在布局XML中给对应控件添加app:animationResolution="0"属性禁用动画,也可以在代码中调用setButtonDrawable()手动替换为无过渡动画的普通状态选择器
全局适配时,可在应用主题中覆盖checkboxStyle、radioButtonStyle样式,将默认的按钮drawable替换为不带动画的StateListDrawable,从根源上规避动画帧缓存问题 - 仅开发调试阶段可临时通过系统开发者选项关闭「动画程序时长缩放」规避异常显示,但该方案不适用于正式发版,无法覆盖普通用户的设备环境。
内容的提问来源于stack exchange,提问作者Krzysiulele
相关产品推荐
相关产品推荐

