用animation旋转图像

图像的两个状态

我拥有的

我有一个箭头图像(就像左边那个)。 当用户点击它时,应该用animation旋转180度,看起来应该是正确的。

我做了什么

private void rotate(float degree, final int toggleV) { final RotateAnimation rotateAnim = new RotateAnimation(0.0f, degree, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); rotateAnim.setDuration(500); toggle.startAnimation(rotateAnim); rotateAnim.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { if (toggleV == 1) toggle.setImageResource(R.drawable.toggle_up); else toggle.setImageResource(R.drawable.toggle_down); } @Override public void onAnimationRepeat(Animation animation) { } }); } 

问题

我看到animation效果不错,但设置图像时有一点闪烁。 可能是因为animation结束和图像设置的时间差。

我怎样才能消除这个闪烁问题? 你有没有更好的方法来做到这一点?

Solutions Collecting From Web of "用animation旋转图像"

首先,你最低的SDK要求是什么? 如果它至less是Android 3.0,那么可以使用较新的animation框架,并使用如下所示的animation来制作图片:

 imageView.animate().rotation(180).start(); 

关于闪烁:我不会重置旋转后的ImageView的源图像,我只是留在原来的,并确保旋转animation填充animation后,离开图像旋转。 在更改源图像时,闪烁很可能是由视图的重新布局/重绘造成的。

进一步的视觉伪影(闪烁?)可能是由于原始旋转的图像和旋转的静态图像可能在几个像素上不同而引起的。

如果我是你,我会使用ViewPropertyAnimator (可从API 12)。 它的语法更直接IMO。
用法是:

 toggle.animate().rotation(0.5f); 

为什么不使用RotateAnimation?

在res中创build一个名为anim的文件夹,在res / anim中创build一个名为rotator.xml的文件。

  <rotate xmlns:android="”http://schemas.android.com/apk/res/android”"> android:duration="”4000”" android:fromdegrees="”0”" android:pivotx="”50%”" android:pivoty="”50%”" android:todegrees="”360”" android:toyscale="”0.0”" </rotate> 

这里一个完整的旋转将在4000毫秒(4秒)内完成。 现在添加一个你想旋转到你的可绘制文件夹的PNG图像。 然后打开res / main.xml,在布局中删除默认的textView后,添加一个ImageView和Button到布局中。 设置ImageView的src属性作为你添加的图像的文件名,例如android:src =“@ drawable / myimg”好的,让我们编辑主类。 在button的onClick()中,添加运行animation所需的代码。 检查下面的代码。

  public class AnimationActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { final ImageView myImage = (ImageView)findViewById(R.id.imageView1); final Animation myRotation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotator); myImage.startAnimation(myRotation); } }); } } 

如果要保留animation的状态,可以使用setFillAfter