android 帧动画

1. 创建帧动画

使用AnimationDrawable类的API.,在工程中的res/anim目录(如果没有anim目录,则自己创建anim目录)下创建一个android XML文件,


在XML文件包含一个根节点元素和好几个子节点来定义每帧。一个资源分别定

义了帧的名字与帧的持续时间。,下面为范例 android huho.xml:

android:oneshot="false">


android:duration="200" />


android:duration="200" />


android:duration="200" />



这个动画播放三个帧动画,通过设置android:oneshot属性为true,它将会在最后一帧停下来,如果设置

为false这个动画将循环播放。这个文件保存到工程目录res/anim目录下为huho.xml,你也

可以添加一个背景图片到视图中,然后开始播放。设置背景图片的时候,不要用每帧动画的图片,因为这样用会看不到动画效果。如果不想设置背景,在layout中的main_activity.xml中的image view中不设图片即可。
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    ImageView rocketImage = (ImageView) findViewById(R.id.imageView1);

    rocketImage.setBackgroundResource(R.anim.hohu);

    rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

    }

    public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {

    rocketAnimation.start();

    return true;

    }

    return super.onTouchEvent(event);

    }

一个比较需要特别注意的是,在AnimationDrawable调用onCreate()过程中不能调用start(),这是因

为AnimationDrawable不能在不完全的窗口上运行,如果你想立即播放动画,没有必要的交互,你可以

再onWindowFocusChanged()方法中调用它。这样它将成为窗口焦点.

说明:

    start():开始播放动画;
    stop():停止播放动画;
    isRunning():判断动画是否正在播放;
    setOneShot():设置是否循环播放。

2.onWindowFocusChanged重要作用

Activity生命周期中,onStart, onResume, onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。
译注:从onWindowFocusChanged被执行起,用户可以与应用进行交互了,而这之前,对用户的操作需要做一点限制。

比如我们在做OTT项目时候,我们就是在这onWindowFocusChanged来获取主按键的具体位置和宽高的,而在其他标准生命周期的接口中调用都是获取不到的,比如在onResume,onStart中都获取不到信息。

这个onWindowFocusChanged指的是这个Activity得到或者失去焦点的时候 就会call。。
也就是说 如果你想要做一个Activity一加载完毕,就触发什么的话 完全可以用这个!!!

使用一个view的getWidth() getHeight() 方法来获取该view的宽和高,返回的值却为0。
如果这个view的长宽很确定不为0的话,那很可能是你过早的调用这些方法,也就是说在这个view被加入到rootview之前你就调用了这些方法,返回的值自然为0.
解决该问题的方法有很多,主要就是延后调用这些方法。可以试着在onWindowFocusChanged()里面调用这些方法,验证时可以获取到View的宽高的。


相关执行打印:
1: entry: onStart---->onResume---->onAttachedToWindow----------->onWindowVisibilityChanged--visibility=0---------->onWindowFocusChanged(true)------->

2. exit:  onPause---->onStop---->onWindowFocusChanged(false)  ---------------------- (lockscreen)

3. exit : onPause----->onWindowFocusChanged(false)-------->onWindowVisibilityChanged--visibility=8------------>onStop(to another activity)

3.onWindowFocusChanged时启动动画
public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        ImageView rocketImage = (ImageView) findViewById(R.id.imageView1);

        rocketImage.setBackgroundResource(R.anim.hohu);

        rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

        }

        
         @Override
            public void onWindowFocusChanged(boolean hasFocus)
            {
                super.onWindowFocusChanged(hasFocus);
                if(hasFocus)
                {
                    rocketAnimation.start();
                } else
                {
                    rocketAnimation.stop();
                }
            }

你可能感兴趣的:(android 帧动画)