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

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

我们在开发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返回
    }
};


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值