如何实现Android仪表盘ImageView指示器从固定点旋转且动画不复位

问题原因与解决方案
1. 指示器旋转效果异常
当前设置的旋转锚点为父布局左上角,不符合仪表盘指针绕底部中心旋转的要求,需要调整旋转锚点为指针自身的底部中心位置。
2. 动画结束自动复位
你使用的是Android传统视图动画RotateAnimation,这类动画仅修改View的绘制效果,不会修改View的真实属性,默认动画结束后就会回到初始状态,即使设置fillAfter = true,在RecyclerView滚动触发Item重绘时也会失效。
实现代码
推荐使用属性动画ObjectAnimator实现,不仅锚点设置灵活,还会真实修改View的旋转属性,RecyclerView滚动重绘也不会复位:
// 等待View测量完成后再设置锚点、启动动画,避免宽高为0 imgGauge.post { // 设置旋转锚点为指针自身底部中心 imgGauge.pivotX = imgGauge.width / 2f imgGauge.pivotY = imgGauge.height.toFloat() // 执行0°到180°的旋转动画 ObjectAnimator.ofFloat(imgGauge, View.ROTATION, 0f, 180f).apply { interpolator = LinearInterpolator() duration = 5000 start() } }
如果要继续使用RotateAnimation,可以按如下修改,但不推荐在RecyclerView场景使用:
RotateAnimation( 0f, 180f, Animation.RELATIVE_TO_SELF, 0.5f, // X轴锚点为自身宽度的50% Animation.RELATIVE_TO_SELF, 1f // Y轴锚点为自身高度的100% ).apply { interpolator = LinearInterpolator() duration = 5000 repeatCount = 0 fillAfter = true // 保留动画结束后的状态 imgGauge.startAnimation(this) }
RecyclerView适配注意事项
在Adapter的onBindViewHolder方法中,需要把当前指针对应的角度值存储到对应的数据实体类中,每次绑定Item时直接给imgGauge.rotation赋值,避免Item复用导致指针角度回到初始值。
内容的提问来源于stack exchange,提问作者Omid Kzm
相关产品推荐
相关产品推荐

