Android动画背景图自动播放的实现
2013-12-23 17:29
435 查看
转自http://www.cnblogs.com/zealotrouge/articles/2562118.html
我们在开发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();
}
});
方法二:使用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 "";
}
}
方法三:通过添加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返回
}
};
以上三种方法经过测试没有问题,另外网上有一些说使用重写Activity的onWindowFocusChanged()方法来实现,但是还是有不足,得改变焦点才能触发,虽然理论可以自动实现改变焦点,感觉还是不甚可取。
我们在开发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();
}
});
方法二:使用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 "";
}
}
方法三:通过添加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返回
}
};
以上三种方法经过测试没有问题,另外网上有一些说使用重写Activity的onWindowFocusChanged()方法来实现,但是还是有不足,得改变焦点才能触发,虽然理论可以自动实现改变焦点,感觉还是不甚可取。
相关文章推荐
- Android ListView使用SimpleAdapter
- 老罗Android安全之旅
- Android Make脚本的简记
- Android 源码下载
- Android中的线程小结
- draw9patch超详细教程
- 深入浅出 - Android系统移植与平台开发(九)- JNI介绍
- android:有些listener类型的回调函数不是interface,而是基本类,所以要用extends去继承,不要implement
- android中正确导入第三方jar包
- Android开发人员应避免的10个误区
- Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 错误 解决方案(android-ndk)
- Android项目实战--手机卫士开发系列教程
- 菜鸟Android学习20——TabHost的使用
- Android仿QQ主界面-------完善篇
- Android XMPP 例子(Openfire+asmack+spark) 出现登陆连接错误
- Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法
- Android 跳转到第三方应用
- Andorid之Annotation框架初使用01
- Android服务的生命周期
- android显示view时各回调函数执行顺序