如何实现图片的循环转动?

在Android中我用RotateAnimation自定义了一个image,想让它循环转动,下面是我在res/anim/中的rotate_indefinitely.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<rotate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:duration="1200" />

我用AndroidUtils.loadAnimation()把上述内容应用到ImageView时,一切运作正常:

spinner.startAnimation( 
    AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely) );

但是,每当image转过360°到达最高点时,就会暂停片刻,然后才继续转动,无法连续的进行循环转动,我猜想,有可能是因为我错误的使用了android:iterpolator="@android:anim/accelerate_interpolator"(AccelerateInterpolator)这个内置程序,但我不太清楚该如何解决这种错误,保证image可以连续无停顿的旋转?

原问题:How to make a smooth image rotation in Android?

阅读 7.4k
1 个回答

答:Bakhtiyor
(最佳答案)
你应该使用LinearInterpolato,通过android:interpolator="@android:anim/linear_interpolator".
找到animation XML文件,然后使用内置的android.R.anim.linear_interpolator。
或者你可以创建自己的XML interpolation文件,例如将它命名为res/anim/linear_interpolator.xml:

<?xml version="1.0" encoding="utf-8"?>
<linearInterpolator xmlns:android="http://schemas.android.com/apk/res/android" />

然后添加动画XML:

android:interpolator="@anim/linear_interpolator"

答:ferdy182
设定toDegrees="359",因为360º和0º指的是一个度数


答:Norm Tatlock
无论我怎么做,都不能保证用如下方法可以让image连续循环转动,我只能尽量缩小停顿的时间。如果你不需要做太多次的转动,可以试试如下代码:

float lastDegree = 0.0f;
        float increment = 4.0f;
        long moveDuration = 10;
        for(int a = 0; a < 150; a++)
        {
            rAnim = new RotateAnimation(lastDegree, (increment * (float)a),  Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            rAnim.setDuration(moveDuration);
            rAnim.setStartOffset(moveDuration * a);
            lastDegree = (increment * (float)a);
            ((AnimationSet) animation).addAnimation(rAnim);
        }

答:Luis E. Fernandez
建议使用如下方法:

<?xml version="1.0" encoding="UTF-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1600"
    android:fromDegrees="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:toDegrees="358" />

如果想要往相反方向转的话:

<?xml version="1.0" encoding="UTF-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1600"
    android:fromDegrees="358"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:toDegrees="0" />
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题