有人能告诉我他们是如何使用'RotateDrawable'来处理它是来自代码还是XML或两者兼而有之?关于Drawables动画的文档非常糟糕,动画似乎只适用于图像。我希望能够为所有drawables制作动画。当我试图从XML获取RotateDrawble时只会导致异常。从XML中查找RotateDrawable的正确功能是什么?
非常感谢
Kerubu
答案 0 :(得分:8)
您必须为“level”属性设置动画,其中0是起始值,10000是结束值。
以下示例从开始到结束动画,您可以使用此方法轻松地反转动画。
final RotateDrawable rotateDrawable = ...
ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000).start();
答案 1 :(得分:3)
RotateDrawable似乎没有动画。相反,您必须使用setLevel来更改drawable的旋转。
<?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);
答案 2 :(得分:2)
这是一个很好的工作示例。 Param持续时间用于为其设置动画。
<?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>
答案 3 :(得分:2)
我想在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();
答案 4 :(得分:1)
我没有使用过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);
答案 5 :(得分:1)
以下代码返回一个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();
}
};
}
答案 6 :(得分:1)
你可以手动调用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方法驱动。
答案 7 :(得分:0)
如果你想永远旋转 drawable,你可以像这样在 drawable xml 中使用动画旋转标签。
<?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>