补间动画详解一 基类Animation

Android动画之一:Tween Animation(补间动画)示例详解 摘要 今天花了一天时间学习了Android动画的一种——View Animation(视图动画),好记性不如烂笔头,赶紧写篇博客记录下吧!知识点新鲜出炉,欢迎大家交流研讨! 本篇博客除了简单介绍Android动画知识外,会通过示例代码重点介绍**View Animation(视图动画)**的使用方法及特点。 Android动画的分类 动画的使用是Android开发中常用的知识,今天就带大家一起了解... 阅读详情

补间动画(Tween animation)是通过在两个关键帧之间补充渐变的动画效果来实现的。

Android系统提供了四个补间动画的类,分别是AlphaAnimation、RotateAnimation、ScaleAnimation和TranslateAnimation,另外还有一个能够把多个动画组合起来的AnimationSet类,这些类都有一个共同的基类Animation。

Animation类官方文档:
https://developer.android.com/reference/android/view/animation/Animation.html

类图:


一、Animation介绍

Animation是一个抽象类,无法直接使用,通常使用的是它的直接子类。

public abstract class Animation implements Cloneable {
}

Animation类定义了一些与动画相关的变量,子类可以直接使用。
/**
 * 一个动画周期的持续时间,以毫秒为单位。
 */
long mDuration;

/**
 * 动画开始执行的延时时长。如果大于0,动画的执行时间为startTime+startOffset。
 */
long mStartOffset;

/**
 * 设置为true时,将保持动画开始前的状态。默认值为true。
 */
boolean mFillBefore = true;

/**
 * 设置为true时,将保持动画结束时的状态。默认值为false。
 */
boolean mFillAfter = false;

/**
 * 设置为true时,将应用mFillBefore的值;否则,忽视mFillBefore的值。默认值为false。
 */
boolean mFillEnabled = false;

/**
 * 动画重复的次数。
 */
int mRepeatCount = 0;

/**
 * 动画的重复类型,取值为RESTART(从头播放)或REVERSE(倒序回放)。
 */
int mRepeatMode = RESTART;

/**
 * 表示动画在执行期间,被设置动画的内容在Z轴上的顺序。
 * 取值范围ZORDER_NORMAL(保持不动)、ZORDER_TOP(在所有其他内容的顶部)、ZORDER_BOTTOM(在所有其他内容的底部),默认为ZORDER_NORMAL
 */
private int mZAdjustment;

/**
 * 动画的背景色。
 */
private int mBackgroundColor;

/**
 * 如果设置为true,并且动画窗体有一个壁纸的话,那么动画只会应用给窗体,壁纸是静止不动的。默认值为false。
 */
private boolean mDetachWallpaper = false;

/**
 * 插值器,用来修饰动画效果。
 */
Interpolator mInterpolator;

同时也有一些常量,用来给特定的变量赋值。
/**
 * mRepeatCount设置为INFINITE,表示动画无限循环。
 */
public static final int INFINITE = -1;

/**
 * mRepeatMode设置为RESTART,表示动画结束后从头开始执行。
 */
public static final int RESTART = 1;

/**
 * mRepeatMode设置为REVERSE,表示动画结束后反过来执行。
 */
public static final int REVERSE = 2;

/**
 * setStartTime()传入该值时,动画将在第一次调用getTransformation(long, Transformation)时开始执行。
 */
public static final int START_ON_FIRST_FRAME = -1;

/**
 * 具体的坐标值。
 */
public static final int ABSOLUTE = 0;

/**
 * 相对自身的坐标值。
 */
public static final int RELATIVE_TO_SELF = 1;

/**
 * 相对父容器的坐标值。
 */
public static final int RELATIVE_TO_PARENT = 2;

/**
 * mZAdjustment设置为ZORDER_NORMAL,表示内容在Z轴保持不动。
 */
public static final int ZORDER_NORMAL = 0;

/**
 * mZAdjustment设置为ZORDER_TOP,表示内容的Z轴方向在所有其他内容的顶部。
 */
public static final int ZORDER_TOP = 1;

/**
 * mZAdjustment设置为ZORDER_BOTTOM,表示内容的Z轴方向在所有其他内容的底部。
 */
public static final int ZORDER_BOTTOM = -1;

这些成员变量在构造方法中被初始化。
public Animation(Context context, AttributeSet attrs) {
    TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Animation);

    setDuration((long) a.getInt(com.android.internal.R.styleable.Animation_duration, 0));
    setStartOffset((long) a.getInt(com.android.internal.R.styleable.Animation_startOffset, 0));

    setFillEnabled(a.getBoolean(com.android.internal.R.styleable.Animation_fillEnabled, mFillEnabled));
    setFillBefore(a.getBoolean(com.android.internal.R.styleable.Animation_fillBefore, mFillBefore));
    setFillAfter(a.getBoolean(com.android.internal.R.styleable.Animation_fillAfter, mFillAfter));

    setRepeatCount(a.getInt(com.android.internal.R.styleable.Animation_repeatCount, mRepeatCount));
    setRepeatMode(a.getInt(com.android.internal.R.styleable.Animation_repeatMode, RESTART));

    setZAdjustment(a.getInt(com.android.internal.R.styleable.Animation_zAdjustment, ZORDER_NORMAL));

    setBackgroundColor(a.getInt(com.android.internal.R.styleable.Animation_background, 0));

    setDetachWallpaper(a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false));

    final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0);

    a.recycle();

    if (resID > 0) {
        setInterpolator(context, resID);
    }

    ensureInterpolator();
}
上面的每一个成员变量都有与之对应的set方法和xml属性。以成员变量mDuration为例,它的set方法为setDuration(),xml属性为android:duration。

Animation类内部定义了动画的监听器AnimationListener,通过调用setAnimationListener()方法来设置监听器。

AnimationListener mListener;

/**
 * 设置动画的监听
 */
public void setAnimationListener(AnimationListener listener) {
    mListener = listener;
}

/**
 * 动画的监听
 */
public static interface AnimationListener {
    /**
     * 动画开始时回调。
     */
    void onAnimationStart(Animation animation);

    /**
     * 动画结束时回调。
     * 但是当动画重复次数被设置为INFINITE的时候,该方法不会回调。
     */
    void onAnimationEnd(Animation animation);

    /**
     * 动画重复时回调。
     */
    void onAnimationRepeat(Animation animation);
}

Animation类是通过applyTransformation()方法来处理动画变化的过程。
protected void applyTransformation(float interpolatedTime, Transformation t) {
}
可以看到,在Animation类中applyTransformation()方法是空的,具体实现由它的四个子类来完成。每个动画实现类都重载了Animation类的applyTransformation()方法,该方法把一些属性组装成一个Transformation类,该方法会被getTransformation()方法调用。
在动画的执行过程中,会反复的调用applyTransformation()方法。每次调用参数interpolatedTime值都会变化,该参数从0.0递增为1.0,当该参数为1.0时表示动画结束。Transformation类封装了矩阵Matrix和透明度Alpha值,通过参数Transformation来设置Matrix和Alpha,实现各种效果。

如果我们需要实现自己的动画类,需要下面两个步骤:
(1).继承Animation类。
(2).实现applyTransformation()方法。


一、Animation执行过程

在启动动画时,一般是调用View类的startAnimation(anim)方法。
先从View类开始看起。

public void startAnimation(Animation animation) {
    animation.setStartTime(Animation.START_ON_FIRST_FRAME);
    setAnimation(animation);
    invalidateParentCaches();
    invalidate(true);
}

protected Animation mCurrentAnimation = null;

public void setAnimation(Animation animation) {
    mCurrentAnimation = animation;
    // other code ......
}
在startAnimation()方法内部,先调用setAnimation()方法给成员变量mCurrentAnimation赋值,然后它调用invalidate()来重绘自己。

接下来进入draw()方法。
boolean draw(Canvas canvas, ViewGroup parent, long drawingTime) {
    // other code ......
    final Animation a = getAnimation();
    if (a != null) {
        more = applyLegacyAnimation(parent, drawingTime, a, scalingRequired);
    }
    // other code ......
}

public Animation getAnimation() {
    return mCurrentAnimation;
}

private boolean applyLegacyAnimation(ViewGroup parent, long drawingTime,
            Animation a, boolean scalingRequired) {
    // other code ......
    boolean more = a.getTransformation(drawingTime, t, 1f);
    // other code ......
}
在draw()方法内部调用了View类的applyLegacyAnimation(),而applyLegacyAnimation()内部又调用了Animation类的getTransformation(long,Transformation,float)方法。

再次回到Animation类中,会发现最终在getTransformation()方法中调用了applyTransformation()方法,实现各种动画效果。
public boolean getTransformation(long currentTime, Transformation outTransformation,
    float scale) {
    mScaleFactor = scale;
    return getTransformation(currentTime, outTransformation);
}

public boolean getTransformation(long currentTime, Transformation outTransformation) {
    // other code ......
    applyTransformation(interpolatedTime, outTransformation);
    // other code ......
}

微信小程序项目实例——家居团购(1) 退货 阅读详情

相关推荐

Android动画总结系列(3)——补间动画源码分析

本文分析了补间动画的源码,总结了补间动画的实现思路,总体来讲,补间动画就是外部调用方(View)不断的传入真实执行时间,动画根据真实时间计算插值时间,再根据插值时间计算当前位置的转化效果,并应用在外部传入的Transformation对象上,而外部调用方使用此Transformation对View展示进行转化,最终形成插值动画效果。

u013478336的专栏 2873

Android动画(二)——补间动画

补间动画(Tween Animation)是一种常见的动画技术,用于在动画序列中创建平滑的过渡效果。它通过定义起始状态和结束状态之间的差异来自动生成中间帧,从而实现连续的动画效果。补间动画通常涉及两个关键帧(Keyframe):起始关键帧和结束关键帧。起始关键帧定义了动画的初始状态,而结束关键帧定义了动画的最终状态。通过在这两个关键帧之间进行插值计算,可以生成一系列中间帧,形成平滑的动画过渡。在补间动画中,可以对多个属性进行动画化,如位置、大小、旋转、透明度等。

Sean_Word的博客 966

Android动画(帧动画、补间动画、属性动画)讲解

** Android动画(帧动画、补间动画、属性动画)讲解 ** 首先我们来看看啥是帧动画、补间动画、属性动画。 介绍: 帧动画:是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。 补间动画:指的是做FLASH动画时,在两个关键帧中间需要做“补间动画”,才能实现图画的运动; 属性动画:帧动画与补间动画实现了对View进行移动、缩放、旋转和淡入淡出的效果。但对于android开发师来说是不够的,同

程序猿追的博客 2万+

Android补间动画、帧动画、属性动画详解

以前一直是自己在网上东平西凑的找,找到的东西也是零零散散,很多时候都是看着看着就没了,时间浪费了,问题却还没得到解决,很让人抓狂。后面我就自己整理了一套资料,还别说,真香!资料有条理,有系统,还很全面,我不方便直接放出来,大家可以先看看有没有用得到的地方吧。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!67108)][外链图片转存中…(img-u8xyeI9D-1712596567108)]

2301_77595001的博客 1456

PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)

该篇是学习使用PYNQ开发板,实际上是对ZYNQ PL端AXI_CDMA 核的应用。实验步骤参照官网的教程,一步一步地做,但是由于在硬件资源布置方面与官方教程稍有出入,所以在SDK的源码里也进行了修改。 AXI_CDMA特性: 如果是使用ZYNQ 7系列芯片(可能其他Xilinx也是通用的),xilinx的AXI_CDMA 核有两种传输模式:轮询(poll)和中断(...

YGLeeeon的博客 3521

【Nature Communications】超高介电常数材料 Hf0.5Zr0.5O2(HZO)

复旦大学AnQuanJiang团队在《NatureCommunications》发表研究,通过原子层沉积技术制备Hf0.5Zr0.5O2(HZO)薄膜电容器,结合等离子体处理获得突破性性能:介电常数达921,储能密度584J/cm³,效率近100%。研究揭示了铁电性消失后氧空位有序排列产生超高介电常数的机制,并通过同步辐射衍射和STEM分析证实了微观结构转变。该材料在85-300K温度范围内保持稳定,经1万亿次循环后仍能维持100μC/cm²电荷密度,为高密度DRAM和CMOS器件集成提供了新方案。

荷塘阅色 2453

tween.js缓动(补间动画)

一、理解tween.js 如果看到上面的已经理解了,可以跳过下面的部分.下面为对Tween.js的解释 下面就介绍如何使用这个Tween了,首先b、c、d三个参数(即初始值,变化量,持续时间)在缓动开始前,是需要先确定好的。 首先引入一个概念就补间动画 Flash做动画时会用到Tween类,利用它可以做很多动画效果,例如缓动、弹簧等等。 ...

weixin_34061042的博客 685

AI辅助发明专利撰写实战:30分钟高效生成高质量技术专利文档

在技术专利撰写领域,尤其是软件、算法或系统架构相关的发明专利,如何将创新的技术构思快速、规范地转化为符合《专利法》要求的申请文件,是许多开发者和技术团队面临的共同挑战。传统的人工撰写方式不仅耗时耗力,对撰写人的法律和技术双重背景要求极高,还容易因格式或术语不规范导致审查意见增多。本文将分享一套利用 AI 辅助工具,系统化、高效率地完成一篇高质量发明专利说明书撰写的实战流程。通过清晰的步骤拆解、可复制的提示词(Prompt)工程以及关键注意事项,即使是首次接触专利撰写的开发者,也能在短时间内掌握从技术方案梳理

子夜轻风 949

Android Animation动画详解(一): 补间动画

前言 你有没有被一些APP中惊艳的动画效果震撼过,有没有去思考,甚至研究过这些动画是如何实现的呢? 啥?你没有思考,更没有研究过? 好吧,那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画特效吧,come on! 一、Android的动画类型 Tween Animation补间动画 Frame Animation帧动画 Layout An...

weixin_34185364的博客 246

25、压电泵致动器变形计算与测量及转弯腔射流特性的有限元分析

本文围绕压电泵致动器的变形计算与测量以及转弯腔射流特性的有限元分析展开研究。通过建立有限元模型和抛物线拟合方法,对压电泵致动器的位移和变形体积进行了详细计算,并探讨了其对传感器性能的影响。同时,利用ANSYS软件对转弯腔在不同角速率输入下的射流特性进行了仿真分析,揭示了流场分布随角速率变化的规律。研究成果为压电流体角速率传感器的设计优化提供了理论依据和技术支持。

ooo22的博客 125

YOLO11优化:TGRS2026 CKConv结合C3k2 | 方向特征与跨阶段融合协同,小目标漏检率大幅下降

多尺度适配小目标尺寸变化:在 C3k2 不同阶段配置 CKConv 不同核尺度(浅层小核捕获精细纹理,深层大核聚合上下文),兼顾局部细节与全局感知,提升对舰船、车辆等小尺寸目标及红外热目标的检测鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 563

Android 动画系列之补间(Tween)动画详解

上一篇博客中写了逐帧动画(Frame)的使用,Android中除了支持逐帧动画(Frame)之外,也提供了对补间(Tween)动画的支持。补间动画就是指开发者只需要指定动画的开始、结束等“关键帧”,而动画的变化的“中间帧”则由系统计算并补齐。这也是“补间”二字的来意。

Airsaid 1万+

harbor x509: certificate signed by unknown authority【20251222】

本教程通过「合并证书链(服务器端)+ 预置根 CA(客户端)」彻底解决了自签名证书的 x509 错误,同时集成了 Trivy 漏洞扫描,实现了 Harbor 从搭建到实用的全流程。证书链合并是服务器端的关键,确保客户端获取完整信任路径;客户端需同时配置「系统信任库 + Docker 信任目录」,避免 Docker 独立信任机制导致的问题;所有 IP 需保持一致(Harbor 配置、证书绑定、客户端访问),是避免错误的基础。

老韩的Linux云计算架构师进阶之路 681

Android补间动画

概述 本篇读书笔记基于《Android开发艺术探索》,将会介绍以下三种动画: View 动画 帧动画 属性动画 一、View动画 首先,我们要知道View动画作用的对象是View,它支持平移、缩放、旋转和透明度四种变换效果,它们的具体描述如下表所示: 名称 标签 子类 效果 平移动画 <translate> TranslateAnimation 移动View 缩...

Marck的博客 3715

Python爬虫实战:利用最新技术爬取微信公众号文章(基于搜狗搜索)

使用最新Python版本确保兼容性和性能:比传统Requests更强大的HTML解析库Playwright:新一代浏览器自动化工具,比Selenium更高效Asyncio:异步IO框架提升爬虫效率Redis:分布式任务队列和去重MongoDB:非关系型数据库存储结构化数据本文详细介绍了如何利用Python最新技术栈构建一个功能强大的微信公众号文章爬虫。通过结合Playwright浏览器自动化、异步IO、分布式任务队列等技术,我们实现了一个能够绕过反爬机制、高效稳定抓取数据的解决方案。

2201_76125261的博客 1794

CLASSB类移植(满足IEC 60730-1和60355-1标准)

针对软件认证需要满足IEC 60730-1和60335-1标准,ST公司专门提供的软件扩展包X-CUBE-CLASSB,它包含自测库和文档,支持多种STM32系列芯片,通过预集成测试库和标准化流程,帮助开发者快速满足国际安全标准,适用于家电、工业控制等高可靠性场景。ClassB软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,MCU在上电的时候会进行复位启动,在启动完成以后会进行运行自检。

m0_61973119的博客 1401

Android学习|动画——逐帧、补间、属性动画

Android学习|动画 一、 动画类型 1.逐帧动画(frame-by-frame animation) : 几张图片进行快速的播放形成的动画 2.补间动画(tweened animation) 3.属性动画(property animation) 逐帧动画(frame-by-frame animation) : 几张图片进行快速的播放形成的动画 1、drawable下创建xml,添加animation-lisanimation-list添加图片 duration 一张图片显示的多少毫秒 02

weixin_52551903的博客 2632

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android 动画之补间动画

在Android中,动画可以分为三种模式,View Animation、Frame Animation、Property Animation,其中Frame Animation又是View Animation一种特殊形式,只不过它和平移、旋转等常见的View Animation在表现形式上略有不同。View AnimationView Animation又称为Tween Animation,即补间动

行云间 1896

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

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

Android 动画之补间动画(View Animation)

Android 中补间动画包括下面四种: 1.透明度动画 (AlphaAnimation) 2.缩放动画 (ScaleAnimation) 3.平移动画 (TranslateAnimation) 4.旋转动画 (RotateAnimation) 补间动画是专门针对View 的。只能应用于View。 具体使用 AlphaAnimation 补间动画可以使用Java代码创建也可以使用...

xujian197的博客 2003

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android四种补间动画

android的动画分为两大类:补间动画,帧动画。 补间动画又分为四大类:移动补间动画,缩放补间动画,旋转补间动画,透明补间动画。 这四种补间动画都是Animation的子类。 移动补间动画:TranslateAnimation eg: Animation  animation = new TranslateAnimation(0,50,0,50)

u011506413的博客 2645

animation之补间动画

补间动画 设定初始值和终止值,由系统算法算出过渡值的动画 补间动画与属性动画最大的不同在于补间动画的属性并不会真实作用在控件上 补间动画有四种(位移 , 缩放 , 透明度,旋转),四种动画动可以用xml和code实现 四种动画都有的公共属性 属性名称 xml code 执行时间 android:duration="1000" animation.setD...

weixin_37073118的博客 702

Android动画(Frame Animation帧动画,Tweened Animation补间动画,Property Animation 属性动画)

Android动画(Frame Animation帧动画,Tweened Animation补间动画,Property Animation 属性动画)

夏夜追凉丶的博客 2837

Android动画合集之补间动画

Android 补间动画摘要 补间动画(Tween Animation)是Android中实现视图动画效果的基本方式,通过定义视图的起始和结束状态(位置、透明度、旋转或缩放),系统自动计算中间过渡帧实现平滑动画。它支持透明度变化(AlphaAnimation)、缩放(ScaleAnimation)、旋转(RotateAnimation)和平移(TranslateAnimation)四种基本类型,也可通过AnimationSet组合多个动画效果。 实现方式分为XML配置和代码创建两种:XML方式在res/an

likuoelie的博客 911

Android 动画系列之自定义补间动画

在上一篇中写到了Android提供了Animation类作为补间动画的抽象基类,并提供了四个子类:ScaleAnimation 、TranslateAnimation、AlphaAnimation、RotateAnimation分别实现了四种基本动画形式:缩放改变、位置改变、透明度改变和旋转改变。 但是我们在实际项目开发中,也有可能遇到更复杂的动画形式。比如说:三维旋转等。那么这个时候Android自己提供的就不能满

Airsaid 3395

天啦噜!原来Android补间动画可以这么玩

提起动画,无论是哪种语言哪种系统框架,比如说android、iOS、H5、Flash等,动画在其之中都扮演着举足轻重的角色。Android系统中最常用的动画方式有三种: 补间动画(Tween Animation) 帧动画(Frame Animation) 属性动画(Property Animation) 本文就总结一下补间动画的相关玩法。 什么是补间动画 Creates an animation by performing a series of transformations on a singl

乂星人 3719

Android Animation 动画使用详解

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、帧动画 使用详解二、补间动...

程序员Android 7464
上一篇: 设计模式之装饰者模式
下一篇: 补间动画详解二 渐变动画AlphaAnimation
ruancoder
博客等级 码龄10年 42粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值