Android动画系列之帧动画详解

本文详细介绍了Android中的帧动画技术,包括其工作原理、XML配置方法及代码实现方式,并讨论了其性能影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的性能损耗较大。使用时需慎重考虑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值