我们在开发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()方法来实现,但是还是有不足,得改变焦点才能触发,虽然理论可以自动实现改变焦点,感觉还是不甚可取。