Android动画全篇系列(一)——逐帧动画

一、逐帧动画介绍

逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。 ——《百度百科

逐帧动画是最好理解的动画,也是很简单暴力的动画。

二、实现

  1. 导入资源
    frame_0frame_1frame_2
    如果你没有动画资源,可以将上面三张图片拖到Windows桌面,然后导入Android Studio中。
    将这三张图片放置res/drawable-* 中(必须是drawable中,不能是mipmap,否则会找不到图片资源)。
  2. 然后“右键”drawable,创建一个animation-list的xml文件:
    animation-list
  3. 编写xml
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/frame_0" android:duration="100"/>
    <item android:drawable="@drawable/frame_1" android:duration="100"/>
    <item android:drawable="@drawable/frame_2" android:duration="100"/>
</animation-list>

<animation-list> 标签下仅有一种标签 <item> 可以使用,其标签仅有两个属性:
-drawable:就是对应的图片,
-duration :每一张图片显示的时间(单位ms)

  1. 加载这个animation-list,如果是对于ImageView,可以设置成他的src属性,如果是对于其他View或者ViewGroup,可以设置成background属性:
    布局
<ImageView
        android:id="@+id/img_frame"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/anim_frame_one"/>

<TextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是TextView"
        android:gravity="center"
        android:background="@drawable/anim_frame"/>
  1. 开始动画
    在开始动画之前,我们要先拿到其所对应的Drawable,如上所示,对于ImageView,因为他是设置的src属性,所以可以通过img_frame.getDrawable()来获取,而对于background属性,我们可以直接通过tv_text.getBackground()来获取。
    拿到之后,发现他们都是Drawable,并没有动画相关的方法!所以我们调试的时候看看这个Drawable是什么Drawable
    原来是AnimationDrawable,那么我们直接强行把获得的Drawable转换成AnimationDrawable,果然发现了有动画相关的方法:
		btn_start_img.setOnClickListener {
            (img_frame.drawable as AnimationDrawable).start()
        }
        btn_start_text.setOnClickListener {
            (tv_text.background as AnimationDrawable).start()
        }

接下来看看效果图:
动画

三、AnimationDrawable

既然我们都知道了我们创建的animation-list文件会以Drawable的样子实现,那么我们完全可以动态创建Drawable的资源,然后赋值给ImageView的drawable属性或者其他View的background属性中。

动态加载动画

动态加载动画的话,就可以将我们在之前的布局中删除一行代码

ImageView的
android:src="@drawable/anim_frame_one" 
TextView的
android:background="@drawable/anim_frame"
		val animDrawable = resources.getDrawable(R.drawable.anim_frame,null) as AnimationDrawable
        val animDrawable2 = resources.getDrawable(R.drawable.anim_frame,null) as AnimationDrawable

        btn_start_img.setOnClickListener {
            img_frame.setImageDrawable(animDrawable)
            (img_frame.drawable as AnimationDrawable).start()
        }
        btn_start_text.setOnClickListener {
        	//这里为什么要创建第二个animDrawable?
        	//如果还沿用第一个animDrawable,那么他们的引用会是
        	//同一个animDrawable,会出现其他错误。
            tv_text.background = animDrawable2
            (tv_text.background as AnimationDrawable).start()
        }

动态加载动画

AnimationDrawable的方法
  • stop() -停止动画。
  • isRunning():Boolean -判断动画是否正在运行。
  • getNumberOfFrames():int -获取动画的帧数(该Demo用了3张图片,那么该方法返回的int为3)。
  • getFrame(int index):Drawable -获取第index帧的图片。
  • getDuration(int index):int -获取第index帧的显示时长。
  • setOneShot(boolean oneShot) -设置是否播放一次动画。
  • addFrame(Drawable frame, int duration) -添加一帧。

优缺点

优点
  1. 实现简单
缺点
  1. 图片占用资源大。
  2. 图片如果比较大,可能会OOM。
  3. 图片数量多的话,可能会造成卡顿。
  4. 只实现动画的播放,交互性很差。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 平台上使用 Animator 创建逐帧动画可以通过以下步骤实现: 1. 首先,在 res/drawable 目录下创建一个 XML 文件来定义您的动画序列,例如: ```xml <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/frame1" android:duration="100"/> <item android:drawable="@drawable/frame2" android:duration="100"/> <item android:drawable="@drawable/frame3" android:duration="100"/> <item android:drawable="@drawable/frame4" android:duration="100"/> <item android:drawable="@drawable/frame5" android:duration="100"/> </animation-list> ``` 上述代码定义了一个包含 5 帧动画动画序列,每一帧的持续时间为 100ms。 2. 在您的 Activity 中,使用以下代码来加载动画并将其应用到 ImageView 上: ```java ImageView imageView = findViewById(R.id.imageView); AnimationDrawable animation = (AnimationDrawable) getResources().getDrawable(R.drawable.my_animation); imageView.setImageDrawable(animation); animation.start(); ``` 上述代码中,我们首先通过 findViewById 方法获取了 ImageView 控件的实例,然后通过 getResources().getDrawable 方法加载了我们在第一步中定义的动画序列,并将其设置为 ImageView 的背景。最后,我们调用了动画的 start 方法来启动动画。 以上就是使用 Animator 创建逐帧动画的基本步骤。您可以根据自己的需要对动画序列进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值