我在旋转ImageView时遇到问题,让它保持指向正确的方向。本质上,ImageView是一个箭头,它应该始终指向屏幕的边缘或角落(由陀螺仪的设备程度决定),但它只是在不正确的位置之间闪烁。例如,如果指针从屏幕的右上角开始并指向该角落,则应该移动并指向屏幕顶部,xy位置将正确移动,但指针在指向之间反弹左上角和右上角。
要设置指针的位置我有:
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()时,我使用的度数可能不正确 - 我只是用随机值填充它,而我试图找出闪烁的问题。
答案 0 :(得分:0)
闪烁的问题可能就在这一行:
rotate.setDuration(1);
这意味着你只需要1毫秒的动画,这真的很短。
你可能意味着:
rotate.setRepeatCount(1);
表示您正在播放动画一次。
我建议你研究一下这个课程:ViewPropertyAnimator它非常简单直接,可以通过像你这样转动你的视图来节省很多你的RotateAnimation代码。 :
pointer.animate()
.rotationBy(pointerDegree)
.setInterpolator(new LinearInterpolator)
.setDuration(100);
该类中有更多的rotationX和rotationY方法,请务必检查所有可用的方法。