是的!我通過閱讀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