带有旋转动画的旋转图像视图在度数位置之间闪烁(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);

这意味着您只对视图进行动画处理 1 毫秒,这非常非常短。

你可能的意思是:

rotate.setRepeatCount(1);

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

我建议你看看这个类:ViewPropertyAnimator它非常简单明了,可以通过像这样旋转视图来节省大量的RotateAnimation代码:

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

该类中有更多的 rotationX 和 rotationY 方法,请务必检查所有可用的方法。

最新更新