逐帧动画详解

Android动画全篇系列(一)——逐帧动画 文章目录一、逐帧动画介绍二、实现三、AnimationDrawable动态加载动画AnimationDrawable的方法 一、逐帧动画介绍 逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。 ——《百度百科》 逐帧动画是最好理解的动画,也是很简单暴力的动画。 二、实现 导入... 阅读详情
概述
逐帧动画(Frame Animation),是通过将一系列图片按照一定的顺序展示实现的动画。同是视图动画(View Animation),在使用时比补间动画(Tween animation)要简单很多。

一、逐帧动画的使用
(1).使用xml文件创建
节点介绍:
<animation-list>:必须作为根元素,可以包含一个或多个<item>元素。
<item>:代表一帧动画。
属性介绍:
android:oneshot:若等于true,动画只执行一次;否则一直循环。
android:drawable:当前帧所对应的图片资源。
android:duration:当前帧持续的时长,单位毫秒。

示例代码:
/res/drawable目录下添加如下5张图片。

在/res/drawable目录下添加wifi_anim.xml文件。
<?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/card_icon_wifi_0" android:duration="500" />
    <item android:drawable="@drawable/card_icon_wifi_1" android:duration="500" />
    <item android:drawable="@drawable/card_icon_wifi_2" android:duration="500" />
    <item android:drawable="@drawable/card_icon_wifi_3" android:duration="500" />
    <item android:drawable="@drawable/card_icon_wifi_4" android:duration="500" />
</animation-list>
将上面创建的动画应用到布局的View中。
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/wifi_anim"/>
在java代码中启动动画。
// 获取AnimationDrawable对象
AnimationDrawable animation = (AnimationDrawable) imageView.getBackground();
// 启动动画
animation.start();

(2).使用java代码创建
示例代码:
AnimationDrawable animation = new AnimationDrawable();
for (int i = 0; i < 5; i++) {
  int id = getResources().getIdentifier("card_icon_wifi_" + i, "drawable", getPackageName());
  Drawable drawable = getResources().getDrawable(id);
  // 调用addFrame()方法依次添加drawable对象
  animation.addFrame(drawable, 500);
}
// 添加到View中
imageView.setBackgroundDrawable(anim);
// 启动动画
animation.start();

注意:在Activity的onCreate()方法中,由于Window对象还未初始化完成,此时调用animation.start(),动画不会执行。若需要在Activity启动时就显示动画,可以在onWindowFocusChanged(boolean hasFocus)方法中启动。

二、逐帧动画的分析
逐帧动画是通过AnimationDrawable类来实现。在AnimationDrawable类中,定义了一个AnimationState类型的成员变量mAnimationState,用来存储一系列的drawable对象。
public class AnimationDrawable extends DrawableContainer implements Runnable, Animatable {
    // ...
    private AnimationState mAnimationState;
    // ...
}

AnimationState继承自DrawableContainerState类。AnimationState类自己定义了成员变量mDurations和mOneShot,分别存储每一帧的时长和动画是否需要循环。而在其父类中有一个Drawable类型数组mDrawables,用于存储每一帧drawable对象。
private final static class AnimationState extends DrawableContainerState {
    // ...
    private int[] mDurations;
    private boolean mOneShot = false;
    // ...

    public void addFrame(Drawable dr, int dur) {
        // ...
        int pos = super.addChild(dr);
        mDurations[pos] = dur;
	// ...
    }
    // ...
}

public abstract static class DrawableContainerState extends ConstantState {
    // ...
    Drawable[] mDrawables;
    // ...

    public final int addChild(Drawable dr) {
        // ...
        mDrawables[pos] = dr;
	// ...
    }
}

当调用addFrame()方法时,动画的每一帧被依次添加到成员变量mAnimationState中。
public void addFrame(@NonNull Drawable frame, int duration) {
    mAnimationState.addFrame(frame, duration);
    if (!mRunning) {
        setFrame(0, true, false);
    }
}

最后,调用start()方法启动动画。方法内部调用了setFrame()方法,在setFrame()中调用selectDrawable(),传入当前帧的索引,并在方法最后调用invalidateSelf()重写绘制。
public void start() {
    mAnimating = true;

    if (!isRunning()) {
        // Start from 0th frame.
        setFrame(0, false, mAnimationState.getChildCount() > 1
                || !mAnimationState.mOneShot);
    }
}

private void setFrame(int frame, boolean unschedule, boolean animate) {
    if (frame >= mAnimationState.getChildCount()) {
        return;
    }
    mAnimating = animate;
    mCurFrame = frame;
    selectDrawable(frame);
    if (unschedule || animate) {
        unscheduleSelf(this);
    }
    if (animate) {
        // Unscheduling may have clobbered these values; restore them
        mCurFrame = frame;
        mRunning = true;
        scheduleSelf(this, SystemClock.uptimeMillis() + mAnimationState.mDurations[frame]);
    }
}

Android--Animotion动画详解-逐帧动画,补间动画,属性动画。 Android动画分类: 视图动画 ( View Animation ): 逐帧动画(Frame by Frame Animation); 补间动画(TweenedAnimations Animation) Android-Animotion动画详解-逐帧动画,补间动画,属性动画。 阅读详情

相关推荐

FLASH逐帧动画飞鸟素材

如果有足够的素材,制作逐帧动画其实很简单,但是如果没有素材就要自己手绘那就不那么容易了,飞鸟素材提供了鸟飞过天空的几个动作的分解素材哦。

Android动画(一)——逐帧动画

Android动画是一种用于创建视觉效果和交互体验的技术,可以增强用户界面的吸引力和响应性。Android提供了丰富的动画框架和API,使开发者可以轻松地添加动画效果到他们的应用程序中。

Sean_Word的博客 955

逐帧动画教程

逐帧动画是Flash动画的一种,主要讲解逐帧动画的制作过程,

玩转css逐帧动画,努力成为更优质的Ikun~

css3的animation想必大家都知道吧,那steps逐帧动画你知道吗?对于我来说,实际工作及练习中也很少用到这种跳跃式变化的动画,而它start和end的解释又比较“不说人话”,以前用到steps动画的时候,常常是靠调试,来回设置start和end,主打的就是瞎猫碰上死耗子。虽然之前也看过关于他们区别的文章,但都是半知半解,过两天就剩零知零解了。最近忙里偷闲,我终于打算一探究竟了,我倒要看看start和end到底有什么区别!😠😠😠顺便写几个小demo造福一方~

坚信万物皆可切的切图仔 2218

逐帧动画 资源

android 动画 资源,一步一步实现android FrameAnimation 动画,让你不再为动画烦恼。

网上逐帧动画的资源修改后的积分变少

网上的逐帧动画的资源,里面有图片,animation-list格式里面加载就行,AnimationDrawable的设置的图片里面可以加载,逐帧动画, 逐帧, 资源,动画

Animate软件基础:创建逐帧动画

选择“插入”>“时间轴”>“关键帧”,或者右键单击 (Windows) 或按住 Control 单击 (Macintosh),然后选择“插入关键帧”。7.若要测试动画序列,请选择“控制”>“播放”或单击“控制器”(“窗口”>“工具栏”>“控制器”)上的“播放”按钮。若要创建逐帧动画,请将每个帧都定义为关键帧,然后为每个帧创建不同的图像。逐帧动画是Animate动画类型中比较简单的一种动画,制作效果取决于绘制和动画水平。每个新关键帧最初包含的内容和它前面的关键帧是一样的,因此可以递增地修改动画中的帧。

FlashASer的博客 1167

Buck-Boost电路实战:如何用LM2596模块快速搭建升降压电源(附元件选型指南)

本文详细介绍了如何使用LM2596模块快速搭建Buck-Boost升降压电路,包括硬件选型、电路搭建、示波器实测和进阶技巧。通过实测数据和避坑指南,帮助电子工程师解决电压不稳定、效率低下等常见问题,提升DC-DC变换器的设计水平。

weixin_30485379的博客 109

Maya基础:烘焙动画

Maya基础:逐帧动画

m0_45877477的博客 514

SAP中MRP运行计划行超限问题的分析与解决

SAP中基于生产性物料的采购特点,通常会采用采购计划协议的方式进行采购。其具体的采购计划通常来自于成品计划独立需求,然后通过物料清单,经由MRP跑出。 在采购计划协议中的计划行中,存在一个计划行号,随着MRP在不断跑出新的计划行,该行号资源会消耗完。当计划行号消耗完后,MRP不会再跑出新的计划行。且在MD04或MD02中看不到类似提示信息。此时可以通过MD05来查看是否出现类似下图的提示信息。 ...

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 3842

告别AT串口线!用STM32F407的USB FS口直连EC800M进行物联网通信

本文介绍了一种创新的物联网通信方案,利用STM32F407的USB FS接口直连EC800M模块,替代传统的AT串口线连接。通过详细的硬件对比、STM32CubeMX配置和USB驱动调试步骤,展示了如何实现更高效的AT指令通信,同时降低硬件复杂度和功耗。

weixin_29189987的博客 705

Android 动画系列之逐帧(Frame)动画详解

前段时间太忙了,已经好久没发博客了,好多想写的东西都没时间写,想了想,这个星期就抽时间写一个动画合集吧,把Android中用到的动画做一个大合集。忘记的时候可以上博客来看看。这一篇就先写Android中最简单也最容易理解的动画:逐帧(Frame)动画吧。逐帧动画是通过一张一张的图片,切换形成的动画,就类似与我们看的胶片电影一样,逐帧动画最简单的使用就是在

Airsaid 3030

Seedance2.5本地部署指南:从环境配置到生产优化的完整实践

在 AI 内容生成领域,本地部署方案正逐渐成为开发者和技术团队关注的焦点。Seedance2.5 作为一款支持图像和视频生成的 AI 工具,其完全离线运行的能力解决了云端服务在数据隐私、使用成本和访问稳定性方面的痛点。对于需要处理敏感内容、频繁生成素材或希望完全掌控生成流程的技术人员来说,掌握本地部署方法具有实际价值。 本文将以 Seedance2.5 的本地部署为例,详细介绍从环境准备、依赖配置到运行验证的完整流程,同时深入分析关键参数配置、常见问题排查方法以及生产环境下的优化建议。通过实际部署过程,理解

weixin_33139275的博客 724

Android动画之逐帧动画(FrameAnimation)详解

转载请注明出处:http://blog.youkuaiyun.com/xiaohao0724/article/details/54582965 Android中的动画,大概分为三种: 1、逐帧动画(FrameAnimation) 2、补间动画(TweenAnimation) 3、属性动画(PropertyAnimation) 今天我们就来学习逐帧动画,废话少说直接上效果图

Technology Blogs 2万+

FPGA学习笔记(一)入门背景、软件及时钟约束的概念及程序下载与固化

使用正点原子的PFPGA开拓者V2学习,通过b站上正点原子的手把手教你学FPGA-基于开拓者V2学习。

贾saisai的博客 3277

QEMU源码全解析 —— virtio(3)

QEMU源码全解析 —— virtio(3)

phmatthaus的专栏 1847

android 100逐帧动画资源,Android 逐帧动画创建实例详解

Android 逐帧动画创建实例详解发布时间:2020-10-02 05:49:25来源:脚本之家阅读:99作者:lqhAndroid 逐帧动画创建实例详解前言:我们看早期电影的时候,电影通常是一张一张播放,用我们现在专有名词来说,就是一帧帧来,安卓同样有这样动画效果的编排形式。那么我们先定义逐帧动画xml文件xmlns:android="http://schemas.android.com/ap...

weixin_39952074的博客 211

ceph recovery 相关参数

可以修改的最大回填/恢复选项列在 “恢复/回填选项” 部分。mClock 的修改 默认回填/恢复限制由 osd_mclock_override_recovery_settings 选项,设置为 默认为 false。尝试修改任何默认恢复/回填限制而不设置门控选项,会将该选项重置为 mClock 默认值,并在集群日志中记录一条警告消息。请注意,默认值可能需要几秒钟才能恢复生效。请使用 config show 命令验证限制,如下所示。就直接设置以下参数,过一会就变回了默认值。简单点说官网的意思就是不设置。

weixin_40548182的博客 277

android 创建帧动画,Android 逐帧动画创建实例详解

Android 逐帧动画创建实例详解前言:我们看早期电影的时候,电影通常是一张一张播放,用我们现在专有名词来说,就是一帧帧来,安卓同样有这样动画效果的编排形式。那么我们先定义逐帧动画xml文件xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="true">android:drawable="@d...

weixin_42161450的博客 250

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

逐帧动画详解一

在开始实例讲解之前,先引用官方文档中的一段话: Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画。Frame动画可以被定义在XML文件中,也可以完全编码实现。 如果被定义在XML文件中,我们可以放置在/res下的anim或drawable目录中(/res/[anim | drawable]/filename.xml),文件名可以作为资源ID在代

路在脚下 1549

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java逐帧动画_Android动画之逐帧动画(Frame Animation)实例详解

本文实例分析了Android动画之逐帧动画。分享给大家供大家参考,具体如下:在开始实例讲解之前,先引用官方文档中的一段话:Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画。Frame动画可以被定义在XML文件中,也可以完全编码实现。如果被定义在XML文件中,我们可以放置在/res下的anim或drawable目录中(/res/[anim | drawabl...

weixin_39604280的博客 337

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android动画之逐帧动画(Frame Animation)实例详解

Android动画之逐帧动画(Frame Animation)实例详解 本文实例分析了Android动画之逐帧动画。分享给大家供大家参考,具体如下: 在开始实例讲解之前,先引用官方文档中的一段话: Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画。Frame动画可以被定义在XML文件中,也可

桔子屋 663

android之逐帧,补间动画详解。

在android的世界中有三种动画,它们就是逐帧动画,补间动画,属性 动画。接下来我就分别演示下三种动画的简单用法。各动画的定义: 逐帧动画:就是短时间切换图片,让人们肉眼看起来是连续的,其实就是播放一组图片。就相当于gif图片的生成、还有我们小时候看电影的时候。那时是通过切换胶片来达到放电影。我是农村的,小时候经常看到。不知道你们有木有经历过。。。 补间动画:就是操作某个控件让其展现出旋转、渐变、

游戏人日常 2398

java逐帧动画_Android中的动画详解系列

Android中的动画详解系列逐帧动画其实很简单,下面我们来看一个例子:xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false">xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="fals...

weixin_34826139的博客 126
上一篇: 补间动画详解五 缩放动画ScaleAnimation
下一篇: ImageView的ScaleType详解
ruancoder
博客等级 码龄10年 42粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值