美文网首页动画
【Android 开发】帧动画(Frame animation

【Android 开发】帧动画(Frame animation

作者: 榆野铃爱 | 来源:发表于2019-11-18 17:40 被阅读0次

    引言

    Android开发里一共有三大动画,分别是帧动画(Frame animation)、补间动画(Tween animation)和属性动画(Property animation),先来介绍一下最简单的动画——帧动画。


    内容简概

    一、概念及常用方法
    二、案例——火焰动画
    三、运行效果

    具体内容

    一、概念及常用方法

    (一)概念

    我们平时看的电影、动画片其实都是一帧一帧构成的,通俗地讲就是一张图片是一帧,当播放速度足够快,因为人眼"视觉残留"的原因,会让我们造成动画的"错觉"。这里的帧动画也是如此,Android中实现帧动画,一般我们也会使用Drawable。通过xml方式实现常会用到animation-list。

    (二)常用方法
    animationDrawable 作用
    .stop() 停止动画
    .start() 开始动画
    .isRunning() 判断动画是否正在进行
    animation-list 作用
    oneshot =false反复循环执行,=true执行一次
    duration 图片显示时间长度

    二、案例——火焰动画

    (一)前期准备
    (二)xml方式实现
    1. 创建一个图片文件


    1. 放入所有图片,配置基本属性(播放方式、时间)
    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
        <!--oneshot设置反复执行-->
        <!--一个item对应一帧:一张图片-->
        <item android:drawable="@drawable/campfire01"
            android:duration="100"/>
        <item android:drawable="@drawable/campfire02"
            android:duration="100"/>
        <item android:drawable="@drawable/campfire03"
            android:duration="100"/>
        <!--后面图片操作同上,一共17张图片-->
    </animation-list>
    
    1. 图片文件有了,接着到我们的布局文件:activity_main.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开始" />
    
        <Button
            android:id="@+id/btn_stop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="停止" />
    
        <ImageView
            android:id="@+id/iv_anim"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/fire_anim"
            android:layout_gravity="center"/>
    </LinearLayout>
    
    1. 最后是我们的MainActivity.java,这里在这里控制动画的开始以及暂停。
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
        private Button btn_start;
        private Button btn_stop;
        private ImageView iv_anim;
        private AnimationDrawable anim;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            bindViews();
            anim = (AnimationDrawable) iv_anim.getBackground();
        }
    
        private void bindViews() {
            btn_start = findViewById(R.id.btn_start);
            btn_stop = findViewById(R.id.btn_stop);
            iv_anim = findViewById(R.id.iv_anim);
            btn_start.setOnClickListener(this);
            btn_stop.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_start:
                    anim.start();
                    break;
                case R.id.btn_stop:
                    anim.stop();
                    break;
            }
        }
    }
    
    (三)代码方式创建

    通过xml方式实现最大的弊端就是当图片数量多时,代码量巨大,而且不易修改,而通过代码实现则能优化这一点。

    1. 首先配置布局文件activity_main
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical"
        android:id="@+id/main">
    
        <Button
            android:id="@+id/btn_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开始" />
    
        <Button
            android:id="@+id/btn_stop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="停止" />
    
        <ImageView
            android:id="@+id/iv_anim"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/fire_anim"
            android:layout_gravity="center"/>
    </LinearLayout>
    
    1. 然后在MainActivity中完成添加图片、设置播放时间等相关操作。
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
        private Button btn_start;
        private Button btn_stop;
        private ImageView iv_anim;
        private AnimationDrawable anim;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 1.找到控件
            bindViews();
    
            // 2. 添加每一帧的动画
            anim = new AnimationDrawable();
            int[] resID = {R.drawable.campfire01,R.drawable.campfire02,R.drawable.campfire03,
                    R.drawable.campfire04,R.drawable.campfire05,R.drawable.campfire06,
                    R.drawable.campfire07,R.drawable.campfire08,R.drawable.campfire09,
                    R.![1574069883075.gif](https://img.haomeiwen.com/i18962003/dc22d969220726c8.gif?imageMogr2/auto-orient/strip)
    drawable.campfire10,R.drawable.campfire11,R.drawable.campfire12,
                    R.drawable.campfire13,R.drawable.campfire14,R.drawable.campfire15,
                    R.drawable.campfire16,R.drawable.campfire17};
            for (int id:resID){
                anim.addFrame(getResources().getDrawable(id,null),100);
            }
            // 3. 设置循环播放
            anim.setOneShot(false);
            // 4. 设置ImageView的背景为AnimationDrawable
            iv_anim.setBackground(anim);
        }
        private void bindViews() {
            btn_start = findViewById(R.id.btn_start);
            btn_stop = findViewById(R.id.btn_stop);
            iv_anim = findViewById(R.id.iv_anim);
            btn_start.setOnClickListener(this);
            btn_stop.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_start:
                    anim.start();
                    break;
                case R.id.btn_stop:
                    anim.stop();
                    break;
            }
        }
    }
    

    三、运行效果

    通过上面两种方式实现的效果是一样的,动图如下:



    后记

    用不同方法实现同一种效果可以学到更多,也有助于加深理解。AnimationDrawable还有其他几种运行方式,就不一一展开了,甩个链接→AnimationDrawable运行的几种方式

    优点:有非常大的灵活性,表现任何想表现的内容,合于表演很细腻的动画。
    弊端:容易引起OOM,就是“内存耗尽”或者卡顿。

    相关文章

      网友评论

        本文标题:【Android 开发】帧动画(Frame animation

        本文链接:https://www.haomeiwen.com/subject/wywvictx.html