19

谁能告诉我他们是如何让“RotateDrawable”工作的,无论是来自代码还是 XML,或者两者兼而有之?关于动画 Drawables 的文档很差,动画似乎只适用于图像。我希望能够为所有可绘制对象设置动画。当我试图从 XML 获取 RotateDrawble 时,只是导致异常。从 XML 中找到 RotateDrawable 的正确函数是什么?

非常感谢

克鲁布

4

8 回答 8

12

您必须为“级别”属性设置动画,其中 0 是起始值,10000 是结束值。

下面的示例动画从头到尾,您可以使用此方法轻松反转动画。

final RotateDrawable rotateDrawable = ...
ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000).start();
于 2015-06-17T20:34:51.067 回答
7

我想在 ImageView 上添加一个动画进度图标的完整示例,它基于 Mark Hetherington 的回答。

所以我的动画如下所示:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
                 android:pivotX="50%"
                 android:pivotY="50%"
                 android:fromDegrees="0"
                 android:toDegrees="-360"
                 android:duration="100"
                 android:drawable="@drawable/ic_loop_black_24dp"
    />

图标来自https://material.io/icons/

然后我的布局包含一个 ImageView 如下:

        <ImageView
            android:id="@+id/progress"
            android:layout_marginTop="0dp"
            android:layout_marginLeft="-3dp"
            android:layout_width="30dp"
            android:layout_height="30dp"

            android:visibility="gone"
            android:scaleType="fitCenter"
            android:background="@drawable/progress_anim"
            android:layout_gravity="center_horizontal|center_vertical"
            />

最后在我需要显示动画的代码中:

    RotateDrawable rotateDrawable = ((RotateDrawable)progressImage.getBackground());
    ObjectAnimator anim = ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000);
    anim.setDuration(1000);
    anim.setRepeatCount(ValueAnimator.INFINITE);
    anim.start();
于 2017-06-15T20:26:48.947 回答
4

RotateDrawable 似乎没有动画。相反,您必须使用 setLevel 来更改可绘制对象的旋转。

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/your_drawable"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360" />

并设置级别将旋转drawable:

final ImageView image = (ImageView)findViewById(R.id.imageView1);
final RotateDrawable drawable = (RotateDrawable)image.getDrawable();
drawable.setLevel(500);
于 2011-12-07T15:21:56.380 回答
3

以下代码返回一个 Drawable 包装器,它以编程方式旋转另一个 Drawable:

Drawable rotateDrawable(Drawable d, final float angle) {
    // Use LayerDrawable, because it's simpler than RotateDrawable.
    Drawable[] arD = {
        d
    };
    return new LayerDrawable(arD) {
        @Override
        public void draw(Canvas canvas) {
            canvas.save();
            canvas.rotate(angle);
            super.draw(canvas);
            canvas.restore();
        }
    };
}
于 2013-06-15T12:46:45.133 回答
2

您可以手动调用RotatedDrawable.setLevel() 来旋转drawable,或者您可以阅读ProgressBar 的代码,不确定的drawable 是一个LayerDrawable,其子级为RotatedDrawable,如下所示:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <rotate
             android:drawable="@drawable/spinner_48_outer_holo"
             android:pivotX="50%"
             android:pivotY="50%"
             android:fromDegrees="0"
             android:toDegrees="1080" />
    </item>
    <item>
        <rotate
             android:drawable="@drawable/spinner_48_inner_holo"
             android:pivotX="50%"
             android:pivotY="50%"
             android:fromDegrees="720"
             android:toDegrees="0" />
    </item>
</layer-list>

旋转动画由 ProgressBar 的 onDraw 方法驱动。

于 2013-08-21T11:37:47.217 回答
2

我没有使用过 RotateDrawable,但如果您只是想在图形上设置旋转动画,则不需要它。具有像 RotateDrawable 这样的“级别”的 Drawable 旨在传达信息而不是动画视图。

以下代码围绕其中心旋转 ImageView:

ImageView myImageView = (ImageView)findViewById(R.id.my_imageview);

AnimationSet animSet = new AnimationSet(true);
animSet.setInterpolator(new DecelerateInterpolator());
animSet.setFillAfter(true);
animSet.setFillEnabled(true);

final RotateAnimation animRotate = new RotateAnimation(0.0f, -90.0f,
    RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
    RotateAnimation.RELATIVE_TO_SELF, 0.5f);

animRotate.setDuration(1500);
animRotate.setFillAfter(true);
animSet.addAnimation(animRotate);

myImageView.startAnimation(animSet);
于 2011-05-03T16:19:18.627 回答
2

这是一个很好的工作示例。参数持续时间用于为其设置动画。

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="4000"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="720" >

    <shape
        android:innerRadius="20dp"
        android:shape="ring"
        android:thickness="4dp"
        android:useLevel="false" >
        <size
            android:height="48dp"
            android:width="48dp" />

        <gradient
            android:centerY="0.5"
            android:endColor="@android:color/white"
            android:startColor="#00ffffff"
            android:type="sweep"
            android:useLevel="false" />
    </shape>

</rotate>
于 2015-12-30T13:10:33.800 回答
0

如果你想永远旋转drawable,你可以像这样在drawable xml中使用animated-rotate标签。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <animated-rotate android:drawable="@drawable/ic_refresh" android:pivotX="50%" android:pivotY="50%" />
    </item>
</selector>
于 2020-12-23T06:19:25.063 回答