使用 RotateAnimation 旋转 ImageView 在度数位置之间闪烁 (Android)

Rotating ImageView with RotateAnimation flickers between degree positions (Android)

我在旋转 ImageView 并使其保持指向正确方向时遇到问题。本质上,ImageView 是一个箭头,应该始终指向它所在的屏幕边缘或角落(由陀螺仪的设备角度决定),但它只是在不正确的位置之间闪烁。例如,如果指针从屏幕的右上角开始并指向该角,然后应该移动并指向屏幕的顶部,则 x-y 位置将正确移动,但指针在指向之间反弹左上角和右上角。

要设置指针的位置,我有这个:

public int pointerDegree = 0;
public void rotatePointerTo(int degree)
{
    if(degree==pointerDegree) //if it's already set to the degree it needs to be moved to
        return;
    final RotateAnimation rotate = new RotateAnimation(pointerDegree, degree,
            RotateAnimation.RELATIVE_TO_SELF, 0.5f,
            RotateAnimation.RELATIVE_TO_SELF, 0.5f);
    rotate.setInterpolator(new LinearInterpolator());
    rotate.setDuration(1);
    rotate.setFillEnabled(true);
    rotate.setFillAfter(true);
    pointer.startAnimation(rotate);
    pointerDegree = degree;
}

在 OnSensorChanged 函数中这样调用:

 int baseDegree = (int)degree%360;
    if(baseDegree > -5 && baseDegree < 5)
        rotatePointerTo(-90);
    else if(baseDegree >= 5 && baseDegree <= 85)
        rotatePointerTo(0);
    else if(baseDegree > 85 && baseDegree < 95)
        rotatePointerTo(45);
    else if(baseDegree >= 95 && baseDegree <= 175)
        rotatePointerTo(90);
    else if(baseDegree > 175 && baseDegree < 185)
        rotatePointerTo(135);
    else if(baseDegree >= 185 && baseDegree <= 265)
        rotatePointerTo(180);

我知道当我调用 rotatePointerTo() 时,我使用的度数可能不正确 - 我只是在尝试找出闪烁问题时用随机值填充它。

闪烁的问题可能出在这一行:

rotate.setDuration(1);

这意味着您只为 View 设置了 1 毫秒的动画,这真的非常非常短。

你的意思可能是:

rotate.setRepeatCount(1);

这意味着你正在播放一次动画。

我建议您研究一下 class:ViewPropertyAnimator 它非常简单直接,并且可以通过像这样 f.e 旋转视图来为您节省大量的 RotateAnimation 代码。 :

pointer.animate()
    .rotationBy(pointerDegree)
    .setInterpolator(new LinearInterpolator)
    .setDuration(100);

里面还有更多的rotationX和rotationY方法class,一定要检查所有可用的方法。