Android动画背景图自动播放的实现
由于我们使用的是imageView的setBackgroundResource方法设置的资源背景,相当于布局文件中的android:background属性,这个属性是view类的属性,必须通过getBackground()方法来获取;而getdrawable()是imageview类的方法,必须通过在代码中setImageResource(int)(对应布局文件的android:src)或setImageDrawable(Drawable drawable)方法设置才可以使用getdrawable()方法。
另外还有两种,在网上找的 方法二:使用AsyncTask异步加载启动
我们在开发android应用的时候,经常会遇到类似从网络加载大图,在加载的过程中,在图片要显示的ImageView位置,先显示一个转圈的loading动画图,给用户的体验会更好一些,要实现这个动画图很简单,使用在/res/anim中定义xml的方式,通常使用…. 来实现。 例如:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!--按顺序和时间播放图片 android:oneshot="true" 动画停止时保持最后一帧-->
<item android:drawable="@mipmap/num_10" android:duration="200" />
<item android:drawable="@mipmap/num_11" android:duration="200" />
<item android:drawable="@mipmap/num_12" android:duration="200" />
<item android:drawable="@mipmap/num_13" android:duration="200" />
<item android:drawable="@mipmap/num_14" android:duration="200" />
<item android:drawable="@mipmap/num_15" android:duration="200" />
<item android:drawable="@mipmap/num_16" android:duration="200" />
<item android:drawable="@mipmap/num_17" android:duration="200" />
<item android:drawable="@mipmap/num_18" android:duration="200" />
<item android:drawable="@mipmap/num_19" android:duration="200" />
<item android:drawable="@mipmap/num_20" android:duration="200" />
<item android:drawable="@mipmap/num_21" android:duration="200" />
<item android:drawable="@mipmap/num_22" android:duration="200" />
<item android:drawable="@mipmap/num_23" android:duration="200" />
<item android:drawable="@mipmap/num_24" android:duration="200" />
<item android:drawable="@mipmap/num_25" android:duration="200" />
<item android:drawable="@mipmap/num_26" android:duration="200" />
<item android:drawable="@mipmap/num_27" android:duration="200" />
<item android:drawable="@mipmap/num_28" android:duration="200"/>
<item android:duration="200" android:drawable="@mipmap/num_30"/>
</animation-list>
注意:此处一定要用getBackground();不能用getdrawable()方法,会没效果。原因如下:由于我们使用的是imageView的setBackgroundResource方法设置的资源背景,相当于布局文件中的android:background属性,这个属性是view类的属性,必须通过getBackground()方法来获取;而getdrawable()是imageview类的方法,必须通过在代码中setImageResource(int)(对应布局文件的android:src)或setImageDrawable(Drawable drawable)方法设置才可以使用getdrawable()方法。
不过大多数朋友都会遇到的问题是,动画是做好了,但是界面在加载的时候,动画并不会自动播放,还得通过屏幕点击等事件来触发,这就失去了意义了,实际上,android的动画AnimationDrawable 组件里面有个start()方法用于启动动画播放,但是这个方法不能直接写在onClick,onStart,onResume里面,写进去也是无效的,无法启动动画,只能写在比如事件监听当中,于是我们可以使用点小技巧来实现自动播放
imageView = (ImageView) findViewById(R.id.rocket_image);
imageView.setBackgroundResource(R.drawable.amimation); //将帧动画资源文件作为View控件背景
rocketAnimation = (AnimationDrawable) imageView.getBackground(); //获取背景并强转成为帧动画对象
imageView.post(new Runnable() {
@Override
public void run() {
rocketAnimation.start();
}
});
另外还有两种,在网上找的 方法二:使用AsyncTask异步加载启动
mageView.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();
//注意这里,如果你的图片控件用的是setImageResource ,你这里应该使用getDrawable();
imageView.getViewTreeObserver().addOnPreDrawListener(preDrawListener);
OnPreDrawListener preDrawListener = new OnPreDrawListener(){
@Override
public boolean onPreDraw() {
animationDrawable.start();
return true; //必须要有这个true返回
}
};