Android animation 动画背景图自动播放的实现


Android animation 动画背景图自动播放的实现

Android动画背景图自动播放的实现
我们在开发android应用的时候,经常会遇到类似从网络加载大图,在加载的过程中,在图片要显示的ImageView位置,先显示一个转圈的loading动画图,给用户的体验会更好一些,要实现这个动画图很简单,使用在/res/anim中定义xml的方式,通常使用…. 来实现。 例如:
<?xml version="1.0" encoding="utf-8"?>
<animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:duration="100" android:drawable="@drawable/loading_1" />
<item android:duration="100" android:drawable="@drawable/loading_2" />
<item android:duration="100" android:drawable="@drawable/loading_3" />
<item android:duration="100" android:drawable="@drawable/loading_4" />
<item android:duration="100" android:drawable="@drawable/loading_5" />
<item android:duration="100" android:drawable="@drawable/loading_6" />
<item android:duration="100" android:drawable="@drawable/loading_7" />
<item android:duration="100" android:drawable="@drawable/loading_8" />
<item android:duration="100" android:drawable="@drawable/loading_9" />
<item android:duration="100" android:drawable="@drawable/loading_10" />
<item android:duration="100" android:drawable="@drawable/loading_11" />
<item android:duration="100" android:drawable="@drawable/loading_12" />
</animation-list> 

不过大多数朋友都会遇到的问题是,动画是做好了,但是界面在加载的时候,动画并不会自动播放,还得通过屏幕点击等事件来触发,这就失去了意义了,实际上,android的动画AnimationDrawable 组件里面有个start()方法用于启动动画播放,但是这个方法不能直接写在onClick,onStart,onResume里面,写进去也是无效的,无法启动动画,只能写在比如事件监听当中,于是我们可以使用点小技巧来实现自动播放
目前我知道的有三种方法:

ImageViewimageView=(ImageView)findViewById(R.id.xxx);

方法一:使用Runnalbe()来加载
imageView.setBackgroundResource(R.anim.xxxxx);
finalAnimationDrawableanimationDrawable=(AnimationDrawable)imageView.getBackground();
imageView.post(newRunnable(){
@
Override
publicvoidrun(){
animationDrawable.start();
}
});

注意:此处一定要用getBackground();不能用getdrawable()方法,会没效果。原因如下:

由于我们使用的是imageView的setBackgroundResource方法设置的资源背景,相当于布局文件中的android:background属性,这个属性是view类的属性,必须通过getBackground()方法来获取;而getdrawable()是imageview类的方法,必须通过在代码中setImageResource(int)(对应布局文件的android:src)setImageDrawable(Drawable drawable)方法设置才可以使用getdrawable()方法。
(详情参考帖子:http://www.eoeandroid.com/forum. ... 1&extra=#pid1627412

方法二:使用AsyncTask异步加载启动
imageView.setBackgroundResource(R.anim.xxxxx);
AnimationDrawableanimationDrawable=(AnimationDrawable)imageView.getBackground();
RunAnimrunAnim=newRunAnim();
runAnim.execute("");

classRunAnimextendsAsyncTask<String,String,String>{
@
Override
protectedStringdoInBackground(String...params){
if(!animationDrawable.isRunning()){
animationDrawable.stop();
animationDrawable.start();
}
return"";
}
}

方法三:通过添加addOnPreDrawListener来自动加载 (我是用这个,感觉很好用
imageView.setBackgroundResource(R.anim.xxxxx);
AnimationDrawableanimationDrawable=(AnimationDrawable)imageView.getBackground();

//注意这里,如果你的图片控件用的是setImageResource ,你这里应该使用getDrawable();
imageView.getViewTreeObserver().addOnPreDrawListener(preDrawListener);

OnPreDrawListenerpreDrawListener=newOnPreDrawListener(){
@
Override
publicbooleanonPreDraw(){
animationDrawable.start();
returntrue;//必须要有这个true返回
}
};

以上三种方法经过测试没有问题,另外网上有一些说使用重写Activity的onWindowFocusChanged()方法来实现,但是还是有不足,得改变焦点才能触发,虽然理论可以自动实现改变焦点,感觉还是不甚可取。

转自:mmdev,链接:http://mmdev.iteye.com/blog/1806991



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值