Android-视图旋转动画闪烁

时间:2019-10-16 09:09:30

标签: android animation

我正在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
            }
        });
    }

它可以工作,但是有两个问题:

  • 动画结束时,有一个快速闪烁,在这里我可以短暂地看到起始位置(旋转)的视图。但是,在这小小的眨眼之后,视图将设置为完成旋转(应如此)。我试图在动画开始时更改视图的可见性,并且还使用了硬件加速,但是这些解决方案均无效。

  • 如果在上一个动画结束之前地图的方向再次改变,则会发生新的动画,并且上一个动画将被中断。这会导致视图快速振荡。

如何避免这两个问题?

0 个答案:

没有答案