我希望每次点击按钮时将图像视图旋转30度。
在第一个clic上,我可以正确设置动画,但我无法在动画后更新imageview位置。当我再次点击按钮时,动画从图像视图的原始位置开始,而不是从第一个动画后的最终位置开始。
这是我的代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
turnImg = (ImageView) findViewById(R.id.imageViewturnImg );
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.imgTurn);
// Getting width & height of the given image.
int w = bmp.getWidth();
int h = bmp.getHeight();
turnImg .setImageBitmap(bmp);
Button buttonok = (Button) findViewById(R.id.buttonok);
buttonok.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
turn();
}
});
}
public void turn()
{
float degrees = 30;
RotateAnimation anim = new RotateAnimation(0, degrees,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);
anim.setInterpolator(new LinearInterpolator());
anim.setDuration(300);
anim.setFillEnabled(true);
anim.setFillAfter(true);
anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationEnd(Animation arg0) {
Matrix mat = turnImg.getImageMatrix();
mat.postRotate(30,turnImg.getWidth()/2, turnImg.getHeight()/2);
turnImg.setScaleType(ScaleType.MATRIX);
turnImg.setImageMatrix(mat);
}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationStart(Animation animation) {}
});
turnImg.startAnimation(anim);
}
我认为问题来自于我在onAnimationEnd()中实现位置的方式。
ps:抱歉我的英语不好......
答案 0 :(得分:16)
问题是您的动画不会影响与矩阵旋转相同的对象。也就是说,您正在设置ImageView对象的旋转动画,但是您正在设置该ImageView对象内的图像的旋转。因此,例如,第一次旋转时,ImageView会从0度旋转到30度,然后由于调用setFillAfter(true)而保持30度旋转。然后运行onAnimationEnd()处理程序,将内部图像旋转30度。这有效地将图像跳转到60度的旋转,如用户所见(视图为30,位图为30)。然后,下次动画运行时,它会将视图从0度旋转到30度,内部图像仍然处于30度旋转状态。这使得用户看起来像是从30度旋转到60度。然后在该动画结束时对内部图像应用另一个旋转,最后将图像旋转到60度,然后将视图旋转(再次)到30度,这样图像现在可以旋转到90度。
等等。
有不同的方法来处理这个问题,但一种简单的方法是避免影响两个不同的对象 - 只需使用ImageView。不是每次从0旋转到30,而是从当前旋转到该值加上30度旋转。您可以删除onAnimationEnd()处理程序,因为您将不再需要在视图内旋转图像。
turn()的结果代码更简单:
public void turn()
{
RotateAnimation anim = new RotateAnimation(currentRotation, currentRotation + 30,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);
currentRotation = (currentRotation + 30) % 360;
anim.setInterpolator(new LinearInterpolator());
anim.setDuration(1000);
anim.setFillEnabled(true);
anim.setFillAfter(true);
turnImg.startAnimation(anim);
}
此代码假定currentRotation的实例变量,用于跟踪视图旋转到的最后一度。 如果你允许用户点击动画中期,那么它会更复杂一些,但不是太困难。
顺便说一句,这在3.0中的动画系统中要简单得多; View上现在有一个'rotation'属性,你可以在该属性上运行动画,它可以跟踪它自己的当前值。但上述方法适用于旧版本。