我正在Android上编写一个简单的应用程序,其中的地图会旋转以使其始终指向北。我使用传感器获取设备方向,然后将旧方向和新方向(以六边度表示的方位角)传递给使用 RotationAnimation 将旋转应用于地图的方法。这是代码:
// Method that applies a slow rotation to the map
private void setMapRotation(int old_azimuth, int new_azimuth){
ConstraintLayout map = (ConstraintLayout)findViewById(R.id.mapa); // Map (ConstraintLayout) to rotate
int rotation, rot1, rot2;
// See which direction is the sorter: clock-wise or anti clock-wise
rot1 = new_azimuth - old_azimuth;
rot2 = 360 - Math.abs(rot1);
if (rot1 >= 0) // rot2 rotation direction is the opposite to rot1
rot2 *= -1;
if (Math.min(Math.abs(rot1), Math.abs(rot2)) == Math.abs(rot1))
rotation = rot1;
else
rotation = rot2;
RotateAnimation rotate = new RotateAnimation(0, rotation,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotate.setDuration(1000);
map.setAnimation(rotate);
rotate.setAnimationListener(new Animation.AnimationListener(){
@Override
public void onAnimationStart(Animation arg0) {
}
@Override
public void onAnimationRepeat(Animation arg0) {
}
@Override
public void onAnimationEnd(Animation arg0) {
map.setRotation(new_azimuth); // Fix the new rotation to the map after the animation has finished
}
});
}
它可以工作,但是有两个问题:
动画结束时,有一个快速闪烁,在这里我可以短暂地看到起始位置(旋转)的视图。但是,在这小小的眨眼之后,视图将设置为完成旋转(应如此)。我试图在动画开始时更改视图的可见性,并且还使用了硬件加速,但是这些解决方案均无效。
如果在上一个动画结束之前地图的方向再次改变,则会发生新的动画,并且上一个动画将被中断。这会导致视图快速振荡。
如何避免这两个问题?