使用matrix.postRotate旋转ImageView时,如何降低旋转动画速度?
如何减慢ImageView的Matrix旋转动画速度?
嘿,这个问题我熟!其实matrix.postRotate()本身是瞬时完成旋转的——你直接调用它的话,图片会立刻跳到目标角度,压根没有过渡动画可言。要实现「慢慢旋转」的效果,得把Matrix和Android的动画框架结合起来用,下面给你两种实用方案:
方案1:用ValueAnimator动态驱动Matrix旋转(精确控制)
这是最灵活的方式,能精准控制旋转时长、节奏,完全适配Matrix的使用场景:
- 先创建一个数值动画,定义旋转的起始角度和目标角度
- 设置动画时长(单位是毫秒,数值越大,旋转速度越慢)
- 在动画的每帧回调里,更新Matrix的旋转角度,然后刷新ImageView
代码示例如下:
// 假设你的ImageView实例是imageView,要从0度转到90度,耗时3秒 ValueAnimator rotateAnimator = ValueAnimator.ofFloat(0f, 90f); rotateAnimator.setDuration(3000); // 核心:时长决定速度,3000ms=3秒转完 rotateAnimator.setInterpolator(new LinearInterpolator()); // 匀速旋转,也可以换其他插值器 // 监听动画每帧的变化,更新Matrix rotateAnimator.addUpdateListener(animation -> { float currentDegree = (float) animation.getAnimatedValue(); Matrix matrix = new Matrix(); // 划重点:如果要围绕图片中心旋转,需要先平移到中心,旋转后再移回去 matrix.postTranslate(-imageView.getWidth() / 2f, -imageView.getHeight() / 2f); matrix.postRotate(currentDegree); matrix.postTranslate(imageView.getWidth() / 2f, imageView.getHeight() / 2f); imageView.setImageMatrix(matrix); }); // 启动动画 rotateAnimator.start();
方案2:用ObjectAnimator直接操作Rotation属性(简洁省心)
如果你只是需要实现旋转效果,不想手动折腾Matrix,这个方案更简单——Android会帮你自动处理动画过渡:
// 直接给ImageView设置旋转动画,从0度到90度,耗时3秒 ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 90f); rotateAnimator.setDuration(3000); rotateAnimator.setInterpolator(new LinearInterpolator()); rotateAnimator.start();
额外小贴士
- 插值器(Interpolator)决定旋转节奏:
LinearInterpolator是匀速,AccelerateDecelerateInterpolator是先慢后快再慢,DecelerateInterpolator是先快后慢,按需选择即可 - 如果是在自定义View的
onDraw方法中使用Matrix,同样可以用ValueAnimator驱动角度变化,然后调用invalidate()触发重绘 - 时长是控制速度的关键:比如转360度,设置6000ms就是6秒转一圈,数值越大,旋转越慢
内容的提问来源于stack exchange,提问作者Adeeb karim
相关产品推荐
相关产品推荐

