如何使用“RotateDrawable”?

任何人都可以告诉我他们是如何得到“RotateDrawable”工作无论是从代码或XML或两者兼而有之? animationDrawables的文档很差,animation只能用于图像。 我想能够animation所有的绘图。 当我试图从XML获得一个RotateDrawble只是导致一个exception。 什么是从XML中findRotateDrawable的正确function?

非常感谢

Kerubu

Solutions Collecting From Web of "如何使用“RotateDrawable”?"

您必须animation“级别”属性,其中0是起始值,10000是结束值。

下面的例子从头到尾都有animation,你可以用这个方法轻松地倒转animation。

final RotateDrawable rotateDrawable = ... ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000).start(); 

RotateDrawable似乎不是animation。 相反,你必须使用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); 

这是一个很好的例子。 Param持续时间用于为其设置animation。

 <?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> 

我没有使用过RotateDrawable,但是如果你只是试图在graphics上旋转旋转,你不需要它。 带有像“RotateDrawable”这样的“级别”的drawables是为了传递信息而不是animation视图。

以下代码围绕其中心旋转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); 

下面的代码返回一个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(); } }; } 

你可以手动调用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> 

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

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

所以我的animation如下所示:

 <?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" /> 

最后在代码中,当我需要显示animation我做的:

  RotateDrawable rotateDrawable = ((RotateDrawable)progressImage.getBackground()); ObjectAnimator anim = ObjectAnimator.ofInt(rotateDrawable, "level", 0, 10000); anim.setDuration(1000); anim.setRepeatCount(ValueAnimator.INFINITE); anim.start();