Android - просмотр анимации вращения - PullRequest
0 голосов
/ 16 октября 2019

Я программирую простое приложение на 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
            }
        });
    }

Работает, но есть две проблемы:

  • Когда анимация заканчивается, происходит быстрое мигание, где я могу кратко увидетьвид в исходное положение (вращение). Однако после этого небольшого мигания вид устанавливается на конечное вращение (как и должно быть). Я попытался изменить видимость при запуске анимации, а также использовать аппаратное ускорение, но ни одно из этих решений не работает.

  • Если ориентация карты снова изменится до того, как предыдущая анимацияВ заключение происходит новая анимация, а предыдущая прерывается. Это заставляет представление быстро колебаться.

Как я могу избежать этих двух проблем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...