欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android的动画机制一 ----逐帧动画

程序员文章站 2024-03-24 12:41:46
...

逐帧动画( Frame Animation)又叫Drawable Animation 是最简单的最直观的动画类型,主要利用人眼的视觉暂留效应

实现原理:一系列不断变化的图片,按照一定的顺序以及停留时间,进行不断的切换,来实现一种动画效果

实现方式:分为XML资源文件方式和代码方式

XML文件方式

这是最常用的方式,先将每一帧的图片放入资源文件目录中。然后在资源文件目录中新建一个动画XML文件,在这个文件中使用<animation-list>标签来定义动画帧的序列,使用<item>标签来定义动画的每一帧,并在其中指定帧的持续时间等属性,事例代码如下:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">

    <item
        android:drawable="@drawable/waiting0"
        android:duration="150"></item>
    <item
        android:drawable="@drawable/waiting1"
        android:duration="150"></item>
    <item
        android:drawable="@drawable/waiting2"
        android:duration="150"></item>
    <item
        android:drawable="@drawable/waiting3"
        android:duration="150"></item>

</animation-list>

其中android.onshot用来控制动画是否循环播放,为false,表示循环播放,<item>标签中的android.duration时候用来指定每一帧持续的时间

Activity中的使用代码如下:

public class FrameAnimationActivity extends AppCompatActivity {

    @BindView(R.id.frameAnimation_test_iv)
    ImageView frameAnimation_test_iv;

    AnimationDrawable animationDrawable;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frameanimetion);
        ButterKnife.bind(this);

        frameAnimation_test_iv.setImageResource(R.drawable.test_frameanimation);
        animationDrawable = (AnimationDrawable) frameAnimation_test_iv.getDrawable();
    }

    @Override
    protected void onResume() {
        super.onResume();
        animationDrawable.start();
    }

    @Override
    protected void onPause() {
        super.onPause();
        animationDrawable.stop();
    }
}

代码方式

代码中定义逐帧动画也比较简单,但是不常用代码如下:

 animationDrawable = new AnimationDrawable();
        for(int i=0;i<4;i++){
            int id = getResources().getIdentifier("waiting"+i,"drawable",getPackageName());
            Drawable drawable = getResources().getDrawable(id);
            animationDrawable.addFrame(drawable,150);
        }
        animationDrawable.setOneShot(false);

        frameAnimation_test_iv.setImageResource(R.drawable.test_frameanimation);
        animationDrawable = (AnimationDrawable) frameAnimation_test_iv.getDrawable();

开始动画和结束动画的方法和上面相同