博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动
阅读量:4054 次
发布时间:2019-05-25

本文共 1904 字,大约阅读时间需要 6 分钟。

  在一些需求中,需要在程序运行时动画自动启动,我们也知道在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
RunAnim
extends
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. .post( 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更新操作实现,肯定有其他的方法。以上描述中如有错误,还望多多包含与指教!!!

转载地址:http://jvqci.baihongyu.com/

你可能感兴趣的文章
赛前必看!!NOIP竞赛及CSP认证初赛赛前辅导详细视频教程!!!
查看>>
完美解决AttributeError: module ‘torchvision.models‘ has no attribute ‘detection‘
查看>>
VMWare报错:无法获得VMCI驱动程序的版本:句柄无效。
查看>>
重磅!AI与区块链技术知识分享交流会!特邀贾志刚老师、双一流211高校研究生!
查看>>
入门卷积神经网络必备,基础、理论、实战一网打尽!
查看>>
Java报错:No enclosing instance of type learnJ is accessible.
查看>>
java学习(2)类变量与实例变量
查看>>
java学习(3)类的四大特性1
查看>>
java学习(4)类的四大特性2之继承
查看>>
java学习(5)类的四大特性2之继承(方法重载)
查看>>
java学习(6)类的四大特性2之继承(方法覆盖)
查看>>
java学习(7)类的四大特性2之继承(抽象类)
查看>>
java学习(8)类的四大特性2之继承(接口)
查看>>
java学习(9)类的四大特性2之继承(final)
查看>>
java学习(10)数组
查看>>
java学习(11)位与进制
查看>>
java学习(12)集合(1)
查看>>
java学习(13)集合(2)
查看>>
java学习(14)集合(3)
查看>>
java学习(15)泛型
查看>>