AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动

来源:互联网 发布:魔能2汉化补丁mac 编辑:程序博客网 时间:2024/06/05 03:45

  在一些需求中,需要在程序运行时动画自动启动,我们也知道在android提供的Tween Animation和frame animation。但是当使用frame animation时候,启动Frame Animation动画的代码anim.start();不能在OnCreate()中,因为在OnCreate()中AnimationDrawable还没有完全的与ImageView绑定,在OnCreate()中启动动画,就只能看到第一张图片。现在问题是如何才能让程序启动时自动的启动动画?可以试一下在onStart方法中,但是结果同样不能如我们所愿。这样不行,继续尝试,使用Handler试一下!代码如下:

?
1
2
3
4
5
6
7
8
private Runnable runnable= new Runnable() {
            public void run() {
                frameAnimation.start();
            }
            };
Handler handler=  new Handler();
//在onCreate方法中:
handler.post(runnable); 

handler对象将通过post方法,将里面的Runnable对象放到UI执行队列中,UI消费这个队列,调用Runnable的run方法。这里并不生成新的线程,此时的 Runnable 是运行在UI所在的主线程中。但是这种方法也是不行!

下面即是总结的三种自动启动frame animation的方法:

首先使用AsyncTask:Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。AsyncTask使创建需要与用户界面交互的长时间运行的任务变得更简单。不需要借助线程和Handler即可实现。对于AsyncTask这里就不多说了,也就是用到一点。

?
imageV.setBackgroundResource(R.anim.myframeanimation);
        frameAnim = (AnimationDrawable) imageV.getBackground();
?
class RunAnimextends AsyncTask<String, String, String>{
 
        @Override
        protected String doInBackground(String... params) {
                if(!frameAnim.isRunning()){
                frameAnim.stop();
                frameAnim.start(); 
                }
            return "";
        }
         
    }
//onCreate方法中执行
RunAnim runAnim=new RunAnim();
        runAnim.execute("");

这样就能在是程序自动执行frame animation了。

其次使用View.post(Runnable)的方式:

?
imageV.post(new Runnable(){
 
    @Override
    public void run() {
        frameAnim.start();
    }
     
});

文档:boolean android.view.View .post(Runnable action)

Causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.即可把你的Runnable对象增加到UI线程中运行。

这样也能正常启动frame Animation。

第三就是使用ViewTreeObserver.OnPreDrawListener listener当一个视图树将要绘制时产生事件,可以添加一个其事件处理函数:onPreDraw

?
OnPreDrawListener opdl=new OnPreDrawListener(){
        @Override
        public boolean onPreDraw() {
            animDraw.start();
            return true;
        }
    };
 
//onCreate方法中
imageV.getViewTreeObserver().addOnPreDrawListener(opdl);

以上即是总结的三种自动启动frame animation的方法,当然,对于android线程的处理,UI更新操作实现,肯定有其他的方法。以上描述中如有错误,还望多多包含与指教!!!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机插卡处坏了怎么办 吉利帝豪一键启动钥匙没电怎么办 居民医保断交5年怎么办 社保和医保断了怎么办 停缴了两年社保怎么办 医保交不够20年怎么办 医保断交4个月怎么办 医保断交5个月怎么办 换城市后社保卡怎么办 苹果6s呼叫失败怎么办 苹果手机打电话显示呼叫失败怎么办 苹果手机经常呼叫失败怎么办 苹果手机呼叫号码呼叫失败怎么办 好友把我拉黑了怎么办 有人一直打骚扰电话怎么办 每天都有骚扰电话怎么办 苹果7被电话轰炸怎么办 苹果手机接听声音小怎么办 微信账号封了怎么办 在京东买的手机出现问题怎么办 销售没胆量扫楼怎么办 骨龄比实际年龄小怎么办 身体年龄比实际年龄大怎么办 吃了不熟的鸡蛋怎么办 六角龙尾巴烂了怎么办 兰花长出来的包怎么办 长寿花花开败了怎么办 手机分期0首付怎么办办 办分期手机掉了怎么办 手机办分期被骗了怎么办 办手机分期年龄不够怎么办 信美分期没额度怎么办 家里人不给我钱怎么办 商场租金收不上来怎么办 魅蓝2电池坏了怎么办 格力空调不制冷怎么办 空调外机不好放怎么办 美的空调显示e3怎么办 发现安装空调条码被撕怎么办 删除了国美安装码怎么办 海信空调保修卡丢了怎么办