是的!我通过阅读ProgressBar
代码发现的(未记录的)密钥是,您必须拨打中的Drawable.setLevel()
以使<rotate>
事情发挥作用。该ProgressBar
的工作是这样的(省略额外不重要的代码):
提拉XML:
<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>
在onDraw()
:
Drawable d = getDrawable();
if (d != null)
{
// Translate canvas so a indeterminate circular progress bar with
// padding rotates properly in its animation
canvas.save();
canvas.translate(getPaddingLeft(), getPaddingTop());
long time = getDrawingTime();
// I'm not sure about the +1.
float prog = (float)(time % ANIM_PERIOD+1)/(float)ANIM_PERIOD;
int level = (int)(MAX_LEVEL * prog);
d.setLevel(level);
d.draw(canvas);
canvas.restore();
ViewCompat.postInvalidateOnAnimation(this);
}
MAX_LEVEL
是一个常数,并且始终10000(根据文档)。 ANIM_PERIOD
是以毫秒为单位的动画期间。
不幸的是,由于您需要修改onDraw()
,因此您不能只将该绘图放入ImageView
,因为ImageView
永远不会改变绘图级别。但是,您可能可以从以外的更改ImageView
的可绘制级别。 ProgressBar
(ab)使用AlphaAnimation
来设置级别。所以你会这样做:
mMyImageView.setImageDrawable(myDrawable);
ObjectAnimator anim = ObjectAnimator.ofInt(myDrawable, "level", 0, MAX_LEVEL);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.start();
它可能会工作,但我没有测试过它。
编辑
其实是有一个ImageView.setImageLevel()
方法,所以它可能是那样简单:
ObjectAnimator anim = ObjectAnimator.ofInt(myImageVew, "ImageLevel", 0, MAX_LEVEL);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.start();
结帐http://stackoverflow.com/a/30901885/1052261 – 2016-02-11 10:30:08