我們在開發android應用的時候,經常會遇到類似從網絡加載大圖,在加載的過程中,在圖片要顯示的ImageView位置,先顯示一個轉圈的loading動畫圖,給用戶的體驗會更好一些,要實現這個動畫圖很簡單,使用在/res/anim中定義xml的方式,通常使用…. 來實現。
不過大多數朋友都會遇到的問題是,動畫是做好了,但是界面在加載的時候,動畫並不會自動播放,還得通過屏幕點擊等事件來觸發,這就失去了意義了,實際上,android的動畫AnimationDrawable 組件里面有個start()方法用於啟動動畫播放,但是這個方法不能直接寫在onClick,onStart,onResume里面,寫進去也是無效的,無法啟動動畫,只能寫在比如事件監聽當中,於是我們可以使用點小技巧來實現自動播放
目前我知道的有三種方法:
ImageView
imageView
=
(
ImageView
)
findViewById
(
R
.
id
.
xxx
)
;
方法一:使用Runnalbe()來加載
imageView
.
setBackgroundResource
(
R
.
anim
.
xxxxx
)
;
final AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
imageView . post ( new Runnable () {
@ Override
public void run () {
animationDrawable . start () ;
}
}) ;
final AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
imageView . post ( new Runnable () {
@ Override
public void run () {
animationDrawable . start () ;
}
}) ;
方法二:使用AsyncTask異步加載啟動
imageView
.
setBackgroundResource
(
R
.
anim
.
xxxxx
)
;
AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
RunAnim runAnim = new RunAnim () ;
runAnim . execute ( "" ) ;
class RunAnim extends AsyncTask < String , String , String > {
@ Override
protected String doInBackground ( String ... params ) {
if ( ! animationDrawable . isRunning ()) {
animationDrawable . stop () ;
animationDrawable . start () ;
}
return "" ;
}
}
AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
RunAnim runAnim = new RunAnim () ;
runAnim . execute ( "" ) ;
class RunAnim extends AsyncTask < String , String , String > {
@ Override
protected String doInBackground ( String ... params ) {
if ( ! animationDrawable . isRunning ()) {
animationDrawable . stop () ;
animationDrawable . start () ;
}
return "" ;
}
}
方法三:通過添加addOnPreDrawListener來自動加載
imageView
.
setBackgroundResource
(
R
.
anim
.
xxxxx
)
;
AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
imageView . getViewTreeObserver () . addOnPreDrawListener ( preDrawListener ) ;
OnPreDrawListener preDrawListener = new OnPreDrawListener (){
@ Override
public boolean onPreDraw () {
animationDrawable . start () ;
return true ; //必須要有這個true返回
}
} ;
AnimationDrawable animationDrawable = ( AnimationDrawable ) imageView . getBackground () ;
imageView . getViewTreeObserver () . addOnPreDrawListener ( preDrawListener ) ;
OnPreDrawListener preDrawListener = new OnPreDrawListener (){
@ Override
public boolean onPreDraw () {
animationDrawable . start () ;
return true ; //必須要有這個true返回
}
} ;
以上三種方法經過測試沒有問題,另外網上有一些說使用重寫Activity的onWindowFocusChanged()方法來實現,但是還是有不足,得改變焦點才能觸發,雖然理論可以自動實現改變焦點,感覺還是不甚可取。