Android动画系列之帧动画详解

Android动画系列之帧动画详解

官方文档链接 Animate drawable

简介

逐帧动画就是一个接一个地加载一系列可绘制的资源来创建一个动画。这是一种传统的动画,从某种意义上说,它是由一系列不同的图像组成的,按照顺序播放,就像一卷电影.

使用
xml加载帧动画

在res/drawable/目录下新建一个animation-list动画资源文件

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">

    <item android:drawable="@drawable/frame01" android:duration="500"/>
    <item android:drawable="@drawable/frame02" android:duration="500"/>
    <item android:drawable="@drawable/frame03" android:duration="500"/>
    <item android:drawable="@drawable/frame04" android:duration="500"/>

animation-list>

android:oneshot属性为true时,它将只循环一次,然后停止并保持最后一帧,否则一直循环。

然后将这个资源文件设置到对应的控件上,如ImageView。

/**
     * xml设置帧动画
     */
    private void frameAnimByXml() {

        btnStartAnim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ivFramge.setImageResource(R.drawable.frame_anim);
                animationDrawable = (AnimationDrawable) ivFramge.getDrawable();
                if (animationDrawable != null){
                    animationDrawable.start();//开始动画
                }
            }
        });

        btnStopAnim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (animationDrawable != null){
                    animationDrawable.stop();//停止动画
                }
            }
        });
    }

注意:start()方法调用AnimationDrawable不能在onCreate()方法,因为AnimationDrawable还没有完全连接到窗口。

通过代码来加载帧动画
/**
     * 代码设置帧动画
     */
    private void frameAnimByCode(){
        animationDrawable = new AnimationDrawable();
        Drawable drawable1 = getResources().getDrawable(R.drawable.frame01);
        Drawable drawable2 = getResources().getDrawable(R.drawable.frame02);
        Drawable drawable3 = getResources().getDrawable(R.drawable.frame03);
        Drawable drawable4 = getResources().getDrawable(R.drawable.frame04);

        //将drawable设置到AnimationDrawable
        animationDrawable.addFrame(drawable1,500);
        animationDrawable.addFrame(drawable2,500);
        animationDrawable.addFrame(drawable3,500);
        animationDrawable.addFrame(drawable4,500);
        animationDrawable.setOneShot(true);

        btnStartAnim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ivFramge.setImageDrawable(animationDrawable);

                if (animationDrawable != null){
                    animationDrawable.stop();//调用start前要先stop,不然在第一次动画之后会停在最后一帧,这样动画就只会触发一次
                    animationDrawable.start();
                }
            }
        });

        btnStopAnim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (animationDrawable != null){
                    animationDrawable.stop();
                }
            }
        });
    }
总结

帧动画可以实现比较复杂而酷炫的动画,但是因为加载的是图片资源,对于内存以及UI的性能损耗较大。使用时需慎重考虑。

你可能感兴趣的:(Android动画系列之帧动画详解)