Я программирую простое приложение на 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
}
});
}
Работает, но есть две проблемы:
Когда анимация заканчивается, происходит быстрое мигание, где я могу кратко увидетьвид в исходное положение (вращение). Однако после этого небольшого мигания вид устанавливается на конечное вращение (как и должно быть). Я попытался изменить видимость при запуске анимации, а также использовать аппаратное ускорение, но ни одно из этих решений не работает.
Если ориентация карты снова изменится до того, как предыдущая анимацияВ заключение происходит новая анимация, а предыдущая прерывается. Это заставляет представление быстро колебаться.
Как я могу избежать этих двух проблем?