我们创建了一个具有风力涡轮机旋转部件的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的大小。有没有更好的方法来解决这个问题或快速解决问题?
答案 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:)