文章目录

  • 补间动画
  • RotateAnimation
    • 动画示例
  • ScaleAnimation
    • 动画示例
  • TranslateAnimation
    • 动画示例
  • AlphaAnimation
    • 动画示例
  • AnimationSet 动画组合
    • 动画示例

补间动画

Android常用的四种补间动画分别为RotateAnimationScaleAnimationTranslateAnimationAlphaAnimation,他们的父类为AnimationUML类图如下:

父类通用方法有:

  • public void setFillBefore(boolean fillBefore): 动画完成后,View是否会停留在动画开始的状态,默认为true
  • public void setFillAfter(boolean fillAfter) :动画完成后,View是否会停留在动画结束的状态,优先级大于fillBefore,默认为false
  • public void setFillEnabled(boolean fillEnabled) :控制setFillBefore的值是否生效,如果fillEnabled为false,则setFillBefore无论为何值都不会再生效。
  • public boolean isFillEnabled():返回setFillEnabled设置的值。
  • public void setStartOffset(long startOffset):设置动画延迟启动时间,单位是ms
  • public void setDuration(long durationMillis):设置动画持续时间,如果设置durationMillis < 0会抛异常。
  • public void setRepeatMode(int repeatMode)RESTART:正序重新开始、REVERSE:倒序重新开始,默认是RESTART。注意:repeatCount(count)设置的count值必须>0或者是INFINITE才会生效
  • public void setRepeatCount(int repeatCount):设置动画应该重复的次数。如果为0,则动画只播放一次;如果设置为N(N>0),则将继续播放N次;如果设置为INFINITE,则将无限轮播。默认为0
  • public void setInterpolator(Interpolator i):设置差值器,影响动画的加速曲线。默认为AccelerateDecelerateInterpolator
  • public void setAnimationListener(AnimationListener listener) : 设置动画监听,AnimationListener中的几个方法如下:
animation.setAnimationListener(object : Animation.AnimationListener {override fun onAnimationEnd(animation: Animation?) {//动画结束时回调,注意:当repeatCount设置为Animation.INFINITE不再收到该回调log("onAnimationEnd")}override fun onAnimationStart(animation: Animation?) {//动画开始时回调log("onAnimationStart")}override fun onAnimationRepeat(animation: Animation?) {//repeatCount设置为Animation.INFINITE时动画每执行一次该方法回调就会执行一次log("onAnimationRepeat")}})

RotateAnimation

旋转动画,通过设置目标View的旋转中心、旋转角度来达到旋转目的。RotateAnimation中需要特殊设置的几个参数如下:

// RotateAnimation.java
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,int pivotYType, float pivotYValue) {mFromDegrees = fromDegrees;mToDegrees = toDegrees;mPivotXValue = pivotXValue;mPivotXType = pivotXType;mPivotYValue = pivotYValue;mPivotYType = pivotYType;initializePivotPoint();}
  • fromDegrees:动画开始之前的旋转偏移量
  • toDegrees:动画结束时的旋转偏移量
  • pivotXType:用于设置旋转中心X轴计量类型,可以设置成Animation.ABSOLUTEAnimation.RELATIVE_TO_SELFAnimation.RELATIVE_TO_PARENT之一,pivotXTypepivotXValue组合之后可以表示不同的X轴坐标点。

Animation.ABSOLUTE:目标View的X轴坐标 = View左上角的原点 + pivotXValue数值的点(y方向同理)
Animation.RELATIVE_TO_SELF:目标View的X轴坐标 = View左上角的原点 + View自身宽度 * pivotXValue数值
Animation.RELATIVE_TO_PARENT:目标View的X轴坐标 = View左上角的原点 + View父控件宽度 * pivotXValue

  • pivotXValue:旋转View所围绕的点的X坐标。如果pivotXTypeabsolute,此值可以是一个绝对数字,否则可以是一个0.1f~1.0f 的值。
  • pivotYType:同pivotXType,表示的的是y轴
  • pivotYValue:同pivotXValue,表示的的是y轴

动画示例

方式一:代码动态创建

val rotateAnim: Animation = RotateAnimation(0f,360f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f)
rotateAnim.duration = 2000
rotateAnim.repeatCount = Animation.INFINITE
rotateAnim.interpolator = LinearInterpolator()
rotateAnim.fillAfter = true
mTvTarget.animation = rotateAnim

方式二:XML中设置

//view_rotate.xml中:
<rotate xmlns:android="http://schemas.android.com/apk/res/android"android:duration="2000"android:fillAfter="true"android:fromDegrees="0"android:interpolator="@android:anim/linear_interpolator"android:pivotX="50%"android:pivotY="50%"android:repeatCount="infinite"android:repeatMode="restart"android:toDegrees="360" />

代码中引用:

mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_rotate))

执行效果:

在XML中设置pivotX、pivotY时注意:pivotX pivotY,可取值为数字,百分比,或者百分比p

  • 设置为数字时,表示px像素值。如设置为10,那么中心坐标为View的左上角的原点在x方向y方向加上10px的点。对应代码中的Animation.ABSOLUTE单位。
  • 设置为百分比时(如50%),中心坐标为View的左上角的原点在x方向加上自身宽度50%和y方向自身高度50%的点(即自身中间的位置)。对应代码中的Animation.RELATIVE_TO_SELF
  • 设置为百分比p时(如50%p),中心坐标为View的左上角的原点在x方向加上父控件宽度50%和y方向父控件高度50%的点。对应代码中的Animation.RELATIVE_TO_PARENT

ScaleAnimation

缩放动画,设置的参数如下:

    public ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {mResources = null;mFromX = fromX;mToX = toX;mFromY = fromY;mToY = toY;mPivotXValue = pivotXValue;mPivotXType = pivotXType;mPivotYValue = pivotYValue;mPivotYType = pivotYType;initializePivotPoint();}
  • fromX / toX:分别表示X轴方向在动画开始时、结束时对应的缩放因子
  • fromY / toY:分别表示Y轴方向在动画开始时、结束时对应的缩放因子
  • pivotXType、pivotXValue、pivotYType、pivotYValue具体含义在上面的RotateAnimation已经讲到,这四个值在ScaleAnimation主要是用来确定缩放中心的。

动画示例

方式一:代码动态创建

val scaleAnim = ScaleAnimation(1.0f, 0.5f, 1.0f, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f).apply {duration = 1000repeatCount = Animation.INFINITErepeatMode = Animation.REVERSEfillAfter = true}
mTvTarget.animation = scaleAnim

方式二:XML中创建

// view_scale.xml
<scale xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fillAfter="true"android:fromXScale="1.0"android:fromYScale="1.0"android:interpolator="@android:anim/linear_interpolator"android:pivotX="50%"android:pivotY="50%"android:repeatCount="infinite"android:repeatMode="reverse"android:toXScale="0.5"android:toYScale="0.5" />

代码中引入:

mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_scale))

执行结果:

TranslateAnimation

平移动画,是指对目标View进行平移操作。

    public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {mFromXValue = fromXDelta;mToXValue = toXDelta;mFromYValue = fromYDelta;mToYValue = toYDelta;mFromXType = ABSOLUTE;mToXType = ABSOLUTE;mFromYType = ABSOLUTE;mToYType = ABSOLUTE;}public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,int fromYType, float fromYValue, int toYType, float toYValue) {mFromXValue = fromXValue;mToXValue = toXValue;mFromYValue = fromYValue;mToYValue = toYValue;mFromXType = fromXType;mToXType = toXType;mFromYType = fromYType;mToYType = toYType;}

可以看到有两个不同的构造方法:

  • 第一种把类型固定为ABSOLUTE,那么传入的float fromXDelta, float toXDelta, float fromYDelta, float toYDelta都为固定数值,即(fromXDelta, fromYDelta)(toXDelta、toYDelta)分别代表起始坐标与结束坐标。
  • 第二种传入的类型可以为 Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT 的一种,那么对应的fromXValue、toXValue、fromYValue、toYValue 可以是具体数值或或者0.0~1.0(表示目标View本身或着父View的百分比)。

动画示例

方式一:代码动态创建

val translateAnim = TranslateAnimation(Animation.ABSOLUTE, 0f, Animation.RELATIVE_TO_SELF, 0.5f,Animation.ABSOLUTE, 0f, Animation.RELATIVE_TO_SELF, 0.5f).apply {duration = 2000fillAfter = falseinterpolator = LinearInterpolator()repeatMode = Animation.REVERSErepeatCount = Animation.INFINITE}
mTvTarget.animation = translateAnim

方式二:XML中创建

// view_translate.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:duration="2000"android:fillAfter="true"android:fromXDelta="0"android:fromYDelta="0"android:interpolator="@android:anim/linear_interpolator"android:repeatCount="infinite"android:repeatMode="reverse"android:toXDelta="50%"android:toYDelta="50%" />

代码中引入:

mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_translate))

执行效果:

AlphaAnimation

透明度动画

    public AlphaAnimation(float fromAlpha, float toAlpha) {mFromAlpha = fromAlpha;mToAlpha = toAlpha;}
  • fromAlpha: 动画开始时的透明度: 1.0表示完全不透明,0.0表示完全透明
  • toAlpha: 动画结束时透明度: 1.0表示完全不透明,0.0表示完全透明

动画示例

方式一:代码动态创建

val alphaAnim = AlphaAnimation(1.0f, 0.2f).apply {duration = 1000fillAfter = trueinterpolator = LinearInterpolator()repeatMode = Animation.REVERSErepeatCount = Animation.INFINITE}
mTvTarget.animation = alphaAnim

方式二:XML中创建

//view_alpha.xml
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fillAfter="true"android:fromAlpha="1.0"android:interpolator="@android:anim/linear_interpolator"android:repeatCount="infinite"android:repeatMode="reverse"android:toAlpha="0.0" />

代码中引入:

mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_alpha))

执行效果:

AnimationSet 动画组合

动画组合AnimationSet,本身也继承自Animation,可以将多个动画组合起来使用。如下属性在AnimationSet中设置时的注意事项

  • duration, repeatMode, fillBefore, fillAfter: 当在AnimationSet对象上设置这些属性时,将被下推到所有子动画。
  • repeatCount, fillEnabled: 这些属性在AnimationSet中被忽略。
  • startOffset, shareInterpolator: 这些属性应用于AnimationSet本身。

动画示例

方式1:代码动态生成

    /*** 动画组合AnimationSet* - duration, repeatMode, fillBefore, fillAfter:当在AnimationSet对象上设置这些属性时,将被下推到所有子动画。* - repeatCount, fillEnabled:这些属性在AnimationSet中被忽略。* - startOffset, shareInterpolator: 这些属性应用于AnimationSet本身*/private fun loadAnimSet(): Animation {//方式1:代码动态生成val rotateAnim = loadRotationAnim()val alphaAnim = loadAlphaAnimation()val translateAnim = loadTranslateAnimation()val scaleAnim = loadScaleAnimation()/*** shareInterpolator: 如果想让集合中的所有动画都使用与AnimationSet中* 设置的一样的插值器,则传true;反之,如果集合中每个动画都使用自己的插值器,则传false.*/val animSet = AnimationSet(true).apply {duration = 3000interpolator = LinearInterpolator()fillAfter = truerepeatMode = Animation.REVERSEstartOffset = 100 //延迟执行动画,应用于AnimationSet本身}//animSet.cancel() //取消动画//animSet.reset() //重置动画animSet.addAnimation(rotateAnim)animSet.addAnimation(alphaAnim)animSet.addAnimation(translateAnim)animSet.addAnimation(scaleAnim)return animSet}mTvTarget.startAnimation(loadAnimSet())

方式2:通过XML创建:

//view_animation_set.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:fillAfter="true"android:fillBefore="false"android:interpolator="@android:anim/linear_interpolator"android:repeatMode="reverse"android:shareInterpolator="true"><rotateandroid:fromDegrees="0"android:pivotX="50%"android:pivotY="50%"android:repeatCount="infinite"android:toDegrees="360" /><scaleandroid:fromXScale="1.0"android:fromYScale="1.0"android:pivotX="50%"android:pivotY="50%"android:repeatCount="infinite"android:toXScale="0.5"android:toYScale="0.5" /><!-- startOffset:延迟执行动画--><setandroid:fillAfter="true"android:interpolator="@android:anim/linear_interpolator"android:repeatMode="reverse"android:shareInterpolator="true"android:startOffset="100"><alphaandroid:fromAlpha="1.0"android:repeatCount="infinite"android:toAlpha="0.0" /><translateandroid:fromXDelta="0"android:fromYDelta="0"android:repeatCount="infinite"android:toXDelta="50%"android:toYDelta="50%" /></set>
</set>

代码中引入:

mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_animation_set))

执行结果:

Android 补间动画及动画组合AnimationSet常用方法整理相关推荐

  1. Android平移补间动画,Android 补间动画之平移动画TranslateAnimation

    Android动画系列 博客导航: 1.介绍: Android补间动画之平移动画,在实际的开发过程中,其实有好多地方需要用到平移动画,这是对于平移动画的简单介绍. 2.属性 duration 时间 f ...

  2. android image 位移动画_「translateanimation」Android 补间动画之平移动画TranslateAnimation - seo实验室...

    translateanimation 博客导航: 1.介绍: Android补间动画之平移动画,在实际的开发过程中,其实有好多地方需要用到平移动画,这是对于平移动画的简单介绍. 2.属性 durati ...

  3. Android 补间动画(Tween Animation)

    Tween Animation(补间动画): Tween动画,通过对View的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.动画效果的定义可以采用XML来做也可以采用编 ...

  4. 每日一道面试题(第7期)---Android补间动画与属性动画的区别

    零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣.无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来 ...

  5. Android—逐帧、补间、属性动画

    1.Tween Animation 补间动画 这类动画比较简单,一般就是平移.缩放.旋转.透明度,或者其组合,可以用代码或者xml文件的形式,推荐使用xml文件形式,因为可以复用. 四个动画效果实现类 ...

  6. android 属性动画 补间动画,每日一道面试题(第7期)---Android补间动画与属性动画的区别...

    零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣.无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来 ...

  7. Android 补间动画

    补间动画使用很简单,几行代码便能实现效果,上图上代码: xml很简单,不用说,先给每个按钮加上点击监听 findViewById(R.id.rotateBtn).setOnClickListener( ...

  8. android—补间动画(Tween Animation)旋转的血轮眼

    Android系统提供了两种实现动画的方式,一种是补间动画(Tween Animation),另一种是帧动画(Frame Animation).补间动画可以实现View组件的移动.放大.缩小以及渐变等 ...

  9. Android补间动画笔记

    布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns: ...

  10. android 补间动画有停顿,Android动画原理分析(一)----补间动画

    1.基本特点 补间动画(Tween动画),是android最早的动画框架,从Android1.0开始就有. 功能:可以实现移动.旋转.缩放.渐变四种效果以及这四种效果的组合形式. 实现形式:xml和代 ...

最新文章

  1. python【力扣LeetCode算法题库】35- 搜索插入位置
  2. python处理3000个excel-Python处理Excel数据的坑,一文让你不用重复犯错
  3. [上海]LinkCoder第四期活动——Jeffrey Richter:Win 8应用开发与.NET4.5
  4. 计算机专业迎新标语,迎新 || 标题不要了,只要你
  5. poj1781In Danger(约瑟夫) 问题
  6. VC程序调试技术,一些工具上和具体的问题,包括内存检测
  7. 测试驱动开发 测试前移_测试驱动开发:它是什么,什么不是。
  8. 成年人的世界,嘴上喊的都是主义,心里装的都是生意
  9. 【2020模拟考试T5】【PAT乙】1035 插入与归并 (25分) 两种排序的sort写法
  10. codeforces 735C Tennis Championship(贪心+递推)
  11. 命令行进入android设置,命令行编译生成APK
  12. 3732 Ahui Writes Word
  13. 产品读书《大数据时代:生活、工作与思维的大变革》
  14. jpype了解,获取,安装
  15. 奥运期间证券期货业网络与信息安全突发事件应急预案(一)
  16. 单机游戏修改游戏数据(你自己就是一个外挂,看完这篇,你一定有不小的收获)
  17. 如何清理电脑系统缓存
  18. 在线加密解密网站大全2022(更新中ing)
  19. 1 php方式实现购物车原理,PHP购物车实现的原理
  20. 小米4c刷机包Linux,MIUI【双开应用】数据备份(android通用,分身数据)

热门文章

  1. 如何用微博传播小电影
  2. jetbrain account不能访问的问题
  3. centos 6 php mysql_Centos 6安装完美搭建mysql、php、apache之旅
  4. 小学计算机课打字游戏,小学信息技术打字游戏教案
  5. Linux C/C++程序员 但行好事 莫问前程 Linux系统下 解决Qt5无法连接MySQL数据库的方法
  6. 生日祝福html_祝我家的猪,生日快乐 | 告白墙第21期
  7. Export encrypted key
  8. 云免停机卡免流服务器监控
  9. Spring Boot 3.x特性-JSON(gson,jackson,json-b,fastjson)
  10. 苹果软件上app注意事项