Android平台播放一个帧动画

    众所周知,Android中动画分为两种,一是Tween动画,主要通过ObjectAnimation(如TranslateAnimation)实现,可实现平移、旋转、缩放、淡入淡出等动画效果;还有一种是Frame动画,即帧动画,通过不播放连续的图片实现。本博客为大家讲解Frame动画的实现。
   帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容,而它类似与电影的播放模式,很适合于表演细腻的动画。
   实现帧动画AnimationDrawable类的支持,它是Drawable类的间接子类。这个类主要有一下几种方法:

  • public void start():开始播放逐帧动画。
  • public void stop():停止播放逐帧动画。
  • public void addFrame(Drawable frame,int duration):为AnimationDrawable添加一帧,并设置持续时间。
  • public int getDuration(int i):得到指定index的帧的持续时间。
  • public Drawable getFrame(int index):得到指定index的帧Drawable。
  • public int getNumberOfFrames():得到当前AnimationDrawable的所有帧数量。
  • public boolean isOneShot():当前AnimationDrawable是否执行一次,返回true执行一次,false循环播放。
  • public boolean isRunning():当前AnimationDrawable是否正在播放。
  • public void setOneShot(boolean oneShot):设置AnimationDrawable是否执行一次,true执行一次,false循环播放。

要获得一个帧动画可以通过xml文件和代码编写两种方式,下面贴出一个使用两种方式实现帧动画的小程序。
程序效果图:
Android平台播放一个帧动画_第1张图片
MainActivity.java:

import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ImageView imgView = null; // 播放动画的View
    private AnimationDrawable animDrawable = null; // 动画图片

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 设置点击事件
        findViewById(R.id.btn_use_xml).setOnClickListener(this);
        findViewById(R.id.btn_use_code).setOnClickListener(this);
        findViewById(R.id.btn_start_forever).setOnClickListener(this);
        findViewById(R.id.btn_stop).setOnClickListener(this);

        imgView = (ImageView) findViewById(R.id.img_view);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_use_xml:
                imgView.setBackgroundResource(R.drawable.frame_anim);
                animDrawable = (AnimationDrawable) imgView.getBackground();
                break;
            case R.id.btn_use_code:
                createAnimDrawable();
                imgView.setBackgroundDrawable(animDrawable);
                break;
            case R.id.btn_start_forever:
                // 设置动画次数为一次
                // animDrawable.setOneShot(true);
                // 设置动画次数为非一次,即不断循环
                animDrawable.setOneShot(false);
                animDrawable.start();
                break;
            case R.id.btn_stop:
                animDrawable.stop();
                break;
            default:
                break;
        }
    }

    // 代码创建帧动画
    private void createAnimDrawable() {
        animDrawable = new AnimationDrawable();
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing1), 50);
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing2), 50);
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing3), 50);
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing4), 50);
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing5), 50);
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing6), 50);
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing7), 50);
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing8), 50);
        animDrawable.addFrame(getResources().getDrawable(R.mipmap.utsing9), 50);
    }

}

activity_main.xml
    包含两个切换设置动画形式的按钮、播放/暂停按钮和一个用来显示动画的ImageView。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp">

    <LinearLayout  android:id="@+id/ll1" android:layout_width="match_parent" android:layout_height="wrap_content">

        <Button  android:id="@+id/btn_use_xml" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="使用xml设置动画" />

        <Button  android:id="@+id/btn_use_code" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="使用代码设置动画" />
    </LinearLayout>

    <LinearLayout  android:id="@+id/ll2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/ll1">

        <Button  android:id="@+id/btn_start_forever" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="开始" />

        <Button  android:id="@+id/btn_stop" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="停止" />

    </LinearLayout>

    <ImageView  android:id="@+id/img_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/ll2" android:layout_centerHorizontal="true" />

</RelativeLayout>

frame_anim.xml
    实现帧动画的xml文件

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@mipmap/movie_1" android:duration="50" />
    <item android:drawable="@mipmap/movie_2" android:duration="50" />
    <item android:drawable="@mipmap/movie_3" android:duration="50" />
    <item android:drawable="@mipmap/movie_4" android:duration="50" />
</animation-list>

    END

    欢迎评论吐槽……

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