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文件和代码编写两种方式,下面贴出一个使用两种方式实现帧动画的小程序。
程序效果图:
帧动画效果
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

欢迎评论吐槽…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值