Android中动画详细讲解

article/2025/8/21 21:12:17

一、前言

Android动画经常会在切换activity、数据加载时会用到动画效果,以前接触的比较少,用的都是封装好的动画效果,自己写的比较少,今天心血来潮想写一个自己设计的动画效果,发现学习动画代码比较简单,但是要实现某些特定的动画效果需要很多逻辑,感觉就麻烦了,正好把动画animation整理一下。

二、概述

Android动画实现一般都用animation,动画包含三大类型View Animation,帧动画(Drawable Animation),Property Animation(属性动画);属性动画比较好用,可以重点关注一下。

三、View Animation

只能被用来设置View的动画,动画效果包含四个子类:(位置(TranslateAnimation)、大小(ScaleAnimation)、旋转(RotateAnimation)、透明度(AlphaAnimation);实现View动画的方式有两种,一种是在xml中直接写动画效果,一种是在activity代码中写。

注意:动画效果有一个很大的问题,就是当移动到指定位置后,点击该位置是无效的,只能点击原来的位置才有效,它并不是真的移动到该位置了,可以通过下面的属性动画来解决。

(1)xml编辑动画的方式:

1、首先在res\anim文件夹下创建xml,

<?xml version="1.0" encoding="utf-8"?>
<!--interpolator:差值器,表示动画运行时的时间正常方式,fillAfter:表示动画停留在最后运动的结果-->
<set xmlns:android="http://schemas.android.com/apk/res/android"android:fillAfter="true"android:interpolator="@android:anim/decelerate_interpolator"><!--透明度标签:表示透明0到不透明1之间的变换--><alphaandroid:fromAlpha="0.0"android:toAlpha="1.0" ></alpha><!--旋转标签:fromDegrees:表示旋转角度的起始角度,toDegrees:结束角度。pivotX:表示旋转的X轴坐标;pivotY:表示旋转的Y轴坐标--><rotateandroid:fromDegrees="0.0"android:toDegrees="720"android:pivotX="50%"android:pivotY="50%"/><!--缩放标签:fromXScale,toXScale表示水平缩放的起始值和结束值;fromYScale,toYScale竖直方向的缩放起始值和结束值。pivotX,pivotY,表示缩放动画效果的基准点x,y轴--><scaleandroid:fromXScale="0.4"android:fromYScale="0.4"android:toXScale="1.2"android:toYScale="1.2"android:pivotX="50%"android:pivotY="50%"></scale><!--移动标签:fromXDelta,toXDelta表示x轴移动的像素点;fromYDelta,toYDelta表示Y轴移动的像素点--><translateandroid:fromXDelta="0"android:toXDelta="300"android:fromYDelta="0"android:toYDelta="300"></translate>
</set>

2、在activity代码中调用animation,实现动画效果

   /*xml自定义动画功能*/fun setXmlAnimation(){//加载xml动画var xmlAnimation=AnimationUtils.loadAnimation(this,R.anim.animation_all)//设置动画播放时长xmlAnimation.duration=2000photo_id?.startAnimation(xmlAnimation)}

(2) 通过代码实现动画效果

 

代码实现动画效果的属性其实和在xml中写差不多,但是在代码中写会更加灵活,可以更好的设置重复次数,可以根据加载view的长宽来动态加载移动的位置。

1、实现代码如下:

    /*代码实现动画的四个功能*/fun blendAnimation(){/**  创建一个AnimationSet,它能够同时执行多个动画效果*  构造方法的入参如果是“true”,则代表使用默认的interpolator,如果是“false”则代表使用自定义interpolator*/val mAnimationSet = AnimationSet(true)//透明度动画,从完全透明到不透明,我们的动画都是float型的,所以,在写数字的时候,要加fval alphAnima = AlphaAnimation(0.0f, 1.0f)/**  创建一个旋转动画对象*  入参列表含义如下:*  1.fromDegrees:从哪个角度开始旋转*  2.toDegrees:旋转到哪个角度结束*  3.pivotXType:旋转所围绕的圆心的x轴坐标的类型,有ABSOLUT绝对坐标、RELATIVE_TO_SELF相对于自身坐标、RELATIVE_TO_PARENT相对于父控件的坐标*  4.pivotXValue:旋转所围绕的圆心的x轴坐标,0.5f表明是以自身这个控件的一半长度为x轴*  5.pivotYType:y轴坐标的类型*  6.pivotYValue:y轴坐标*/val rotateAnim = RotateAnimation(0f, 720f, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f)/**  创建一个缩放效果的动画*  入参列表含义如下:*  fromX:x轴的初始值*  toX:x轴缩放后的值*  fromY:y轴的初始值*  toY:y轴缩放后的值*  pivotXType:x轴坐标的类型,有ABSOLUT绝对坐标、RELATIVE_TO_SELF相对于自身坐标、RELATIVE_TO_PARENT相对于父控件的坐标*  pivotXValue:x轴的值,0.5f表明是以自身这个控件的一半长度为x轴*  pivotYType:y轴坐标的类型*  pivotYValue:轴的值,0.5f表明是以自身这个控件的一半长度为y轴*/var scaleAnimation = ScaleAnimation(0f,1f,0f,1f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
/**  创建一个移动动画效果*  入参的含义如下:*  fromXType:移动前的x轴坐标的类型*  fromXValue:移动前的x轴的坐标*  toXType:移动后的x轴的坐标的类型*  toXValue:移动后的x轴的坐标*  fromYType:移动前的y轴的坐标的类型*  fromYValue:移动前的y轴的坐标*  toYType:移动后的y轴的坐标的类型*  toYValue:移动后的y轴的坐标*/var translateAnimation = TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.ABSOLUTE,360f,Animation.RELATIVE_TO_SELF,0f,Animation.ABSOLUTE,360f)mAnimationSet.addAnimation(alphAnima)mAnimationSet.addAnimation(rotateAnim)mAnimationSet.addAnimation(scaleAnimation)mAnimationSet.addAnimation(translateAnimation)mAnimationSet.setDuration(2000)//动画持续时间时间mAnimationSet.setInterpolator(DecelerateInterpolator()) //添加插值器,下面会有说明mAnimationSet.setFillAfter(true)photo_id?.startAnimation(mAnimationSet)}
Animation类的方法解释
reset()重置Animation的初始化
cancel()取消Animation动画
start()开始Animation动画
setAnimationListener(AnimationListener listener)给当前Animation设置动画监听
hasStarted()判断当前Animation是否开始
hasEnded()判断当前Animation是否结束


既然补间动画只能给View使用,那就来看看View中和动画相关的几个常用方法吧,如下:

View类的常用动画操作方法解释
startAnimation(Animation animation)对当前View开始设置的Animation动画
clearAnimation()取消当View在执行的Animation动画

setInterpolator差值器的说明:也可以自定义差值器

java类xml id值描述
AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator动画始末速率较慢,中间加速
AccelerateInterpolator@android:anim/accelerate_interpolator动画开始速率较慢,之后慢慢加速
AnticipateInterpolator@android:anim/anticipate_interpolator开始的时候从后向前甩
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator类似上面AnticipateInterpolator
BounceInterpolator@android:anim/bounce_interpolator动画结束时弹起
CycleInterpolator@android:anim/cycle_interpolator循环播放速率改变为正弦曲线
DecelerateInterpolator@android:anim/decelerate_interpolator动画开始快然后慢
LinearInterpolator@android:anim/linear_interpolator动画匀速改变
OvershootInterpolator@android:anim/overshoot_interpolator向前弹出一定值之后回到原来位置
PathInterpolator 新增,定义路径坐标后按照路径坐标来跑。

2、帧动画(Drawable Animation)

Drawable动画其实就是Frame动画(帧动画),它允许你实现像播放幻灯片一样的效果,这种动画的实质其实是Drawable,所以这种动画的XML定义方式文件一般放在res/drawable/目录下,但是容易引起内存溢出,只适合小型图片的播放功能:

<?xml version="1.0" encoding="utf-8"?>
<!--根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画根标签下,通过item标签对动画中的每一个图片进行声明android:duration 表示展示所用的该图片的时间长度-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false" ><item android:drawable="@drawable/wifi1" android:duration="500"/><item android:drawable="@drawable/wifi2" android:duration="500"/><item android:drawable="@drawable/wifi3" android:duration="500"/><item android:drawable="@drawable/wifi4" android:duration="500"/><item android:drawable="@drawable/wifi5" android:duration="500"/>
</animation-list>

java代码:

  var animDrawable = ContextCompat.getDrawable(this,R.drawable.drawle_animation) as AnimationDrawablephoto_id?.background=animDrawableanimDrawable.start()

 

四、Property Animation(属性动画)

相对于View animation,功能更加强大的。而且是真正的视图移动,点击移动后的视图会有点击效果。属性动画有两个类:ValueAnimatorObjectAnimator。

ValueAnimator:可以设置开始值和结束值来动态改变view的移动位置

ObjectAnimator:功能更加强大,可以控制位移、透明度、旋转、缩放。

1、ValueAnimator的使用

移动的时候使用,使用起来较简单,代码如下

    fun playAnimation(){//获得xml中TextView的宽度和高度val spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)photo_id.measure(spec, spec)val measuredWidth = photo_id.measuredWidthval measuredHeight = photo_id.measuredHeight// ofInt(),其中还包括ofFloat,区别只是写入的内容不同,作用有:// 1. 创建动画实例// 2. 将传入的多个Int参数进行平滑过渡:此处传入0和400,表示将值从0平滑过渡到400// 如果传入了3个Int参数 a,b,c ,则是先从a平滑过渡到b,再从b平滑过渡到C,以此类推// ValueAnimator.ofInt()内置了整型估值器,直接采用默认的.不需要设置,即默认设置了如何从初始值 过渡到 结束值anim= ValueAnimator.ofInt(0,400)// 设置动画的播放各种属性// 设置动画运行的时长anim?.duration=5000// 设置动画延迟播放时间anim?.startDelay=1000// 设置动画重复播放次数 = 重放次数+1// 动画播放次数 = infinite时,动画无限重复anim?.repeatCount=0// 设置重复播放动画模式// ValueAnimator.RESTART(默认):正序重放// ValueAnimator.REVERSE:倒序回放anim?.repeatMode=ValueAnimator.RESTART//动画改变监听器,5ms/帧anim?.addUpdateListener { animation ->// 获得改变后的值var curValue : Int=animation.animatedValue as IntLog.i("feng","时间值____"+curValue)// 将改变的值手动赋值给对象的属性值:通过动画的更新监听器// 设置 值的更新监听器// 即:值每次改变、变化一次,该方法就会被调用一次// 输出改变后的值:依次代表控件的左端、顶端、右端、和底端photo_id?.layout(curValue,curValue,curValue+measuredWidth,curValue+measuredHeight)}anim?.start()// 启动动画}

顺便记录一下在xml写动画效果的方法,该方法不如用kotlin代码写灵活,不太复杂的动画可以使用。

// ValueAnimator采用<animator>  标签
<animator xmlns:android="http://schemas.android.com/apk/res/android"  android:valueFrom="0"   // 初始值android:valueTo="100"  // 结束值android:valueType="intType" // 变化值类型 :floatType & intTypeandroid:duration="3000" // 动画持续时间(ms),必须设置,动画才有效果android:startOffset ="1000" // 动画延迟开始时间(ms)android:fillBefore = “true” // 动画播放完后,视图是否会停留在动画开始的状态,默认为trueandroid:fillAfter = “false” // 动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为falseandroid:fillEnabled= “true” // 是否应用fillBefore值,对fillAfter值无影响,默认为trueandroid:repeatMode= “restart” // 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart|android:repeatCount = “0” // 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复android:interpolator = @[package:]anim/interpolator_resource // 插值器,即影响动画的播放速度。/>  在Java代码中启动动画
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.set_animation);  
// 载入XML动画animator.setTarget(view);  
// 设置动画对象animator.start();  
// 启动动画

2、ObjectAnimator

可实现平移、旋转、透明度、颜色、背景色等。

效果图如下:

实现代码:

    /*ObjectAnimator的使用*/fun playObjectAnimation(){val set = AnimatorSet()//控制透明度的,我用ofInt没好使,还是用float吧var animator1=ObjectAnimator.ofFloat(photo_id,"alpha",0f,1f)animator1?.duration=2000//延X轴移动var animator2=ObjectAnimator.ofFloat(photo_id,"translationX",0f,300f)animator2?.duration=2000animator2?.interpolator=DecelerateInterpolator()//延y轴移动,起始位置和结束位置var animator3=ObjectAnimator.ofFloat(photo_id,"translationY",0f,500f,200f)animator3?.duration=2000animator3?.interpolator=DecelerateInterpolator()//沿X轴旋转var animator4=ObjectAnimator.ofFloat(photo_id,"rotationX",0f,720f)animator4?.duration=2000//沿Y轴旋转var animator5=ObjectAnimator.ofFloat(photo_id,"rotationY",0f,720f)animator5?.duration=2000//缩放,可以根据X轴和Y轴缩放var animator6=ObjectAnimator.ofFloat(photo_id,"scaleX",0f,4f,2f)animator6?.duration=3000//改变颜色var animator7=ObjectAnimator.ofInt(photo_id,"backgroundColor",Color.RED, Color.BLUE, Color.GRAY, Color.GREEN)animator7?.duration=2000set.play(animator1).before(animator2) //先执行anim动画之后在执行anim2set.play(animator2).before(animator3)set.play(animator3).before(animator4)set.play(animator4).before(animator5)set.play(animator5).before(animator6)set.play(animator6).before(animator7)set.start()}

 


http://chatgpt.dhexx.cn/article/PMTZkbYj.shtml

相关文章

android 动画中插值器Interpolator详解

1、插值器简介–Interpolator 通俗易懂的说&#xff0c;Interpolator负责控制动画变化的速率&#xff0c;即确定了 动画效果变化的模式&#xff0c;使得基本的动画效果能够以匀速、加速、减速、抛物线速率等各种速率变化 动画是开发者给定开始和结束的“关键帧”&#xff0c;…

Android中的属性动画

1.属性动画简介 接下来我们学习Android动画中的第三种动画——属性动画(Property Animation) Animation一般动画就是我们前面学的帧动画和补间动画&#xff01;Animator则是本节要讲的属性动画&#xff01; 1.1为什么要用属性动画 补间动画功能比较单调,只有四种动画(透明度…

android 动画库

1. Spruce(安卓动画库)&#xff08;是一个轻量级的动画库&#xff0c;可以帮助排版屏幕上的动画。使用有很多不同的动画库时&#xff0c;开发人员需要确保每个视图都能够在适当的时间活动。&#xff09; 2. Litho&#xff08;是一个非常强大的框架&#xff0c;以声明的方式构建…

android动画类型有哪几种,Android动画概念大揭秘

前言 说起Android里面的动画,我可能会立马想起平移、旋转、渐变、缩放等动画效果,但是对于他们的属性就记的不太清了,知道的都是皮毛而且很容易忘记,每次需要用到的时候总要去baidu或者google,完全无法做到灵活应用,信手拈来。所以抽时间重新温故了一下动画相关的知识,把…

Android 动画分类

前言 动画的使用 是 Android 开发中常用的知识可是动画的种类繁多、使用复杂&#xff0c;每当需要 采用自定义动画 实现 复杂的动画效果时&#xff0c;很多开发者就显得束手无策本文将献上一份Android动画的全面介绍攻略&#xff0c;包括动画的种类、使用、原理等&#xff0c;能…

Android动画

这篇博客主要总结一下自己在项目中对动画的一些使用。我写博客&#xff0c;其实更多的是总结自己在工作中用到的一些知识。比如某一段时间一个知识点相关的技术用的比较多&#xff0c;那我会总结一下。其实&#xff0c;对于Android动画的总结&#xff0c;这是几个月前就应该写完…

Android动画之帧动画

在Android开发时&#xff0c;为了实现一些动态的炫酷的效果&#xff0c;我们常用到帧动画&#xff0c;View动画&#xff08;补间动画&#xff09;和属性动画&#xff0c;今天就来总结下我在使用帧动画的实现方式。 1、什么是帧动画&#xff1f; 帧动画就是顺序播放一组预先定…

【Android】动画

概念 动画实际上就是在指定的时间段内持续的修改某个属性的值&#xff0c;使得该值在指定取值范围之内平滑的过渡 android中的动画分为&#xff1a;View动画、帧动画和属性动画 帧动画 Frame动画是一系列图片按照一定的顺序展示的过程&#xff0c;它的原理是在一定的时间段内切…

STM32 LWIP SNTP实现毫秒级的时间校准

1、首先配置LWIP支持SNTP 然后在opt.h中增加一个timeout->LWIP_SNTP 防止出现类似 Assertion "sys_timeout: timeout ! NULL, pool MEMP_SYS_TIMEOUT is empty" failed at line 190 in ../Middlewares/Third_Party/LwIP/src/core/timeouts.c 这样的错误。 /*…

NTP/SNTP协议介绍和校时服务器搭建

文|Seraph 本文主要简单介绍用于校时的NTP/SNTP协议 同时&#xff0c;以windows 2008 R2为例&#xff0c;搭建NTP/SNTP服务器 NTP可参考文献RFC1305&#xff0c;SNTP可参考文献RFC1796 1. 应用场景 一般应用&#xff0c;连上公网即可通过NTP/SNTP协议进行校时&#xff0c;例如…

linux sntp 代码,C语言window(linux)平台的SNTP实现

C语言实现window(linux)平台的SNTP&#xff0c;本程序功能主要是实现电脑(或者设备)时间同步。摘录部分代码&#xff1a; unsigned char liVnMode; /* LeapSecond(2bits:0), VersionNumber(3bits: 3), Mode(3bits: Client3, Server4) */ unsigned char stratum; /* 时间层级 (0…

学习日记——ESP8266SNTP

SNTP基本知识 1、定义 SNTP是简单网络时间协议&#xff0c;而NTP网络时间协议就是网络计算机上同步计算时间的协议&#xff0c;具有高度的精确性&#xff0c;实际上也用不到这么高精度的算法。所以就在NTP上简化了以下变成SNTP&#xff0c;SNTP协议主要被用来同步因特网上计算…

WiFi开发|ESP8266模组SDK开发之SNTP协议

ESP8266模组SDK开发之SNTP协议 1. NTP和SNTP NTP 是网络时间协议&#xff08;Network Time Protocol&#xff09;&#xff0c;是用来同步网络设备&#xff08;如计算机、手机&#xff09;的时间的协议 SNTP由NTP改编而来&#xff08;简单网络时间协议&#xff0c;Simple Net…

ESP8266学习笔记(11)——SNTP接口使用

一、SNTP简介 简单网络时间协议&#xff08;Simple Network Time Protocol&#xff09;&#xff0c;由 NTP 改编而来&#xff0c;主要用来同步因特网中的计算机时钟 二、SNTP接口 SNTP 接口位于 ESP8266_NONOS_SDK/include/sntp.h。 三、初始化SNTP 设置三个时间服务器…

ESP32 SNTP配置

SNTP&#xff0c;Simple Network Time Protocol&#xff08;简单网络时间协议&#xff09;&#xff0c;用来同步时钟。 百度百科&#xff1a;SNTP SNTP协议采用客户端/服务器的工作方式&#xff0c;可以采用单播&#xff08;点对点&#xff09;或者广播&#xff08;一点对多点&…

通过sntp同步系统时间

通过sntp同步系统时间 小型物联网设备&#xff0c;很少有接口提供给用户进行数据交互&#xff0c;那么我们设备的系统时间只能够通过获取网络时间后&#xff0c;再更新到本地。那么&#xff0c;就少不了使用sntp协议。 ntp协议&#xff1a;NTP(Network Time Protocol&#xff…

2012系统sntp服务器,如何设置SNTP服务器,实现同步PLC时钟

在过程/生产自动化系统构架和运行时&#xff0c;有时需要实现对时间的精确控制&#xff0c;即系统中所有子系统(包括设备等)的时间必须保持同步。 作为自动化系统组成部分的 以Windows 7操作系统为例&#xff0c;将PC机配置为SNTP服务器端的操作步骤&#xff1a; [注意]操作前前…

ESP32学习笔记(41)——SNTP接口使用

一、SNTP简介 简单网络时间协议&#xff08;Simple Network Time Protocol&#xff09;&#xff0c;由 NTP 改编而来&#xff0c;主要用来同步因特网中的计算机时钟。 SNTP 协议是用来同步本地的时间到 unix 时间戳。通常嵌入式设备上电&#xff0c;连接 AP(access point)&…

物联网专题27:SNTP

什么是SNTP&#xff08;Simple Network Time Protocol&#xff09;&#xff1f;简单时钟控制协议&#xff0c;主要用来同步因特网中的计算机时钟。 SNTP&#xff0c;使用的默认端口号是 UDP123。 ESP8266中&#xff0c;SNTP相关的API&#xff1a; 1 设置SNTP服务器&#xff08…

ESP8266-----SNTP获取网络时间

目录 前言 user_init IP定时的回调函数 初始化SNTP SNTP定时回调函数 前言 介绍了8266如何获取网络时间 user_init 首先将8266设置为sta模式 void ICACHE_FLASH_ATTR user_init(void) {uart_init(115200,115200); // 初始化串口波特率os_delay_us(10000); // 等待串口…