使用 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,一定要检查所有可用的方法。
我在旋转 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,一定要检查所有可用的方法。