使用旋转动画实现最短路径动画

3
我想做一个两个角度之间的最短路径旋转动画。我正在使用RotateAnimation(fromDegrees, toDegrees, pivotX, pivotY)方法来动画图像。
问题在于,当fromDegrees为350,toDegrees为10时,它会旋转完整的圆圈(340度),而不仅仅是顺时针旋转20度。
有没有办法强制进行最小旋转?

我注意到在实现GPS指南针时出现了类似的行为,因此检查了一下指针是否从>270和<360之间移动到>=0和<90之间,或者从<90和>=0之间移动到>270和<360之间,并将动画持续时间设置为0,这样您就不会看到旋转朝错误方向进行。这是一个hack,但只要指南针没有疯狂旋转,它几乎不可见。你找到了一个干净的解决方案吗? - warbi
1个回答

3

您可以使用ViewPropertyAnimator代替RotateAnimation,它具有一个名为rotationBy的方法,该方法将视图按照指定值旋转,因此您不需要“from”和“to”值。

这两种动画之间的主要区别在于,RotateAnimation仅移动屏幕上的像素,因此例如OnClickListener不会随像素一起动画,而ViewPropertyAnimator更改了View在屏幕上的实际属性/位置。

ViewPropertyAnimator也非常有用,因为其非常易于实现。一个最小的ViewPropertyAnimator实现,顺时针旋转20度,看起来像这样:

yourImage.animate().rotationBy(20); 

设置动画持续时间是没有错的,同时建议设置插值器,因为这样可以使得任何动画看起来更加逼真:

yourImage.animate()
    .rotationBy(20) -> degrees -20 would be counter clockwise
    .setDuration(1000) -> ms
    .setInterpolator(new AccelerateDecelerateInterpolator());

请务必查看文档,以获取所有可用方法。


这个答案不是关于最短路径实现的。 - Rustam Samandarov
@Rustam Samandarov 为什么不呢?方法rotationBy()强制进行最小旋转。ViewProperty部分只是语法糖。 - A Honey Bustard
我在谈论从设备传感器接收到的-2 + 1度。 - Rustam Samandarov
好的。问题不在于rotationBy方法,而是接收到的设备传感器值。我认为我们必须应用高通滤波器。 - Rustam Samandarov
你在说什么?问题中并没有关于你所建议的内容。难道我漏看了什么吗? - A Honey Bustard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接