在旋转动画期间平滑调整ImageView大小

时间:2016-04-05 04:18:11

标签: android android-layout animation android-studio android-animation

我们创建了一个具有风力涡轮机旋转部件的ImageView,并对其应用了旋转动画,然后添加了一个SeekBar(滑块),允许用户更改旋转叶片的大小。

我们尝试过一系列不同的解决方法,但所有这些都有问题。这是我们当前的SeekBarListener:

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

        // ImageView handle
        final ImageView part_imageView = (ImageView) view_final.findViewById(R.id.part_imageView);

        // When progress changes, change size of blades
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            part_imageView.getLayoutParams().height = 300 + (2 * progress);
            part_imageView.getLayoutParams().width = 300 + (2 * progress);
            part_imageView.getAnimation().reset();


            seekBar_text.setText(part_name + " size : " + (progress + 1));
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

这里是关联的动画xml(在启用侦听器之前应用于part_imageView)。

    <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">

    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="infinite"
        android:duration="4000" />

</set>

我们尝试的第一件事只是在onProgressChanged中更改了ImageView的宽度和高度,但是这并没有更新动画,而是围绕一个不再位于中心的轴进行动画处理(我的猜测是它转换了枢轴指向固定位置而不是连续计算它。)

接下来,我们尝试使用part_imageView.setPivotX(50);重置枢轴点,Y值相同,但这似乎对旋转没有任何影响,它仍然在离轴旋转。 / p>

接下来我们尝试重新应用动画,但是这会将旋转重置为其起点,这是不受欢迎的,看起来很痉挛。

接下来,我尝试了当前在onProgressChanged中的内容,在更改大小后调用part_imageView.getAnimation().reset();。这使得当前位置保持旋转(良好),但是每次杆改变时,在旋转开始时闪烁一帧(坏)的图像。因为SeekBar是非常连续的(100个设置),所以图像几乎在我们改变大小的整个时间闪烁,这看起来很糟糕。

我们想要的是能够在不中断动画的情况下平滑地更改ImageView的大小。有没有更好的方法来解决这个问题或快速解决问题?

1 个答案:

答案 0 :(得分:0)

想出来! 使用属性动画而不是视图动画结束,在xml中创建objectAnimator并将动画应用于ImageView。

这是xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:ordering="sequentially" >

    <objectAnimator
        android:interpolator="@android:anim/linear_interpolator"
        android:propertyName="rotation"
        android:repeatCount="infinite"
        android:repeatMode="restart"
        android:duration="4000"
        android:valueFrom="0"
        android:valueTo="360"
        android:valueType="floatType" />

</set>

谢谢你pskink:)