因为项目需要实现一个变速转动的效果。尝试过程中遇到了两个动画切换时停顿的现象。现在也没有一个好的方案,把今天我的尝试过程记录一下,看看有没有大神能给点建议。
最开始想当然地写了一个循环,循环里面进行动画的设置,后一个动画的开始旋转的角度前一个动画结束时的角度,每次旋转角度差为45*i*i。
最开始的代码如下:
<span style="white-space:pre"> </span>ImageView tv = (ImageView) findViewById(R.id.imageView1);
<span style="white-space:pre"> </span>ObjectAnimator oa ;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>for(int i=1;i<10;i++)
<span style="white-space:pre"> </span>{
oa = ObjectAnimator.ofFloat(tv,"rotation", 45*(i-1)*(i-1),45*i*i);
<span style="white-space:pre"> </span>oa.setDuration(500);
<span style="white-space:pre"> </span>oa.setStartDelay((i-1)*500);<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>oa.start();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
代码运行时发现前后两个动画在切换时,后一个动画总要先停上一下。运行的时候就有一顿一顿的感觉,没有达到预期效果。
后面想着可能是因为旋转角度变化率不均匀可能会导致这种现象,于是乎就将变化率更改成固定的变化率。
代码如下:
ImageView tv = (ImageView) findViewById(R.id.imageView1);
ObjectAnimator oa;
int rotation = 0;
for (int i = 1; i < 10; i++) {
int rotation_tmp = 45*i*i/2;//加速度为45,初速度为0,第i次旋转的角度即为1/2a*t*t
oa = ObjectAnimator.ofFloat(tv, "rotation", rotation, rotation_tmp);
rotation = rotation_tmp;
oa.setDuration(500);
oa.setStartDelay((i - 1) * 500);
oa.start();
}
效果有所改善不过还是一顿一顿的只是不那么明显了。感觉还是不爽,想了下,会不会是动画本身开始的时候就会有一点点停顿时间,于是乎把后一次动画的延迟提前50ms。感觉的确好很多。
代码如下:
ImageView tv = (ImageView) findViewById(R.id.imageView1);
ObjectAnimator oa;
int rotation = 0;
for (int i = 1; i < 10; i++) {
int rotation_tmp = 45*i*i/2;//加速度为45,初速度为0,第i次旋转的角度即为1/2a*t*t
oa = ObjectAnimator.ofFloat(tv, "rotation", rotation, rotation_tmp);
rotation = rotation_tmp;
oa.setDuration(500);
oa.setStartDelay((i - 1) * 500-50);//将延迟减小50ms
oa.start();
}
最后运行下来看着还ok,还有待改善。