Android 补间动画及组合AnimationSet常用方法详解

目录
  • 补间动画
  • 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 = 1000
            repeatCount = Animation.INFINITE
            repeatMode = Animation.REVERSE
            fillAfter = 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 = 2000
            fillAfter = false
            interpolator = LinearInterpolator()
            repeatMode = Animation.REVERSE
            repeatCount = 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 = 1000
            fillAfter = true
            interpolator = LinearInterpolator()
            repeatMode = Animation.REVERSE
            repeatCount = 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 = 3000
            interpolator = LinearInterpolator()
            fillAfter = true
            repeatMode = Animation.REVERSE
            startOffset = 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">
    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="infinite"
        android:toDegrees="360" />
    <scale
        android: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:延迟执行动画-->
    <set
        android:fillAfter="true"
        android:interpolator="@android:anim/linear_interpolator"
        android:repeatMode="reverse"
        android:shareInterpolator="true"
        android:startOffset="100">
        <alpha
            android:fromAlpha="1.0"
            android:repeatCount="infinite"
            android:toAlpha="0.0" />
        <translate
            android: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常用方法详解的详细内容,更多关于Android 补间动画组合AnimationSet的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android实现多张图片合成加载动画

    本文实例为大家分享了Android实现多张图片合成加载动画的具体代码,供大家参考,具体内容如下 1.自定义ProgressDialog public class MyProgressDialog extends ProgressDialog {     private int procressLoadRes;     private ImageView mImageView;     private AnimationDrawable animationDrawable;     public

  • Android动画系列之帧动画和补间动画的示例代码

    Android 提供三种动画:帧动画.补间动画和属性动画,本篇文章介绍帧动画以及补间动画的使用,属性动画的使用将在后面的文章中分享,那就来复习一下这两种动画的使用吧. FrameAnimation FrameAnimation 即逐帧动画,通俗来说就是按照图片动作顺序依次播放来形成动画,创建 FrameAnimation 可用 xml 定义也可直接使用代码创建. xml创建帧动画 在 res/drawable 文件夹下创建一个 drawable 文件,使用 animation-list 标签,具

  • Android Studio实现补间动画

    本文实例为大家分享了Android Studio实现补间动画的具体代码,供大家参考,具体内容如下 补间动画是给出初始位置和结束位置,中间由系统自动补充的动画 1.补间动画的配置文件:scale.xml 2.布局文件:animal_patching.xml 3.main.java sacle.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schem

  • Android实现毛玻璃效果弹出菜单动画

    本文实例为大家分享了Android实现毛玻璃效果弹出菜单动画的具体代码,供大家参考,具体内容如下 仿ios上屏幕下方向上滑出来的一个模糊菜单,效果如下 原理很简单,页面上原来有一个gone的framelayout,调用方法让它弹出的时候加了一个位移动画,让它从底部出来,出来的时候给这个framelayout里的一个imageView设置一个模糊后的截屏图片,并且这个图片也加一个相同时间的反方向位移动画,这个demo里用到的Blur模糊类和自定义imageView可以去我前两篇博客上找到. 这里面

  • Android Flutter绘制有趣的 loading加载动画

    目录 前言 效果1:圆环内滚动的球 效果2:双轨运动 效果3:钟摆运动 总结 前言 在网络速度较慢的场景,一个有趣的加载会提高用户的耐心和对 App 的好感,有些 loading 动效甚至会让用户有想弄清楚整个动效过程到底是怎么样的冲动.然而,大部分的 App的 loading 就是下面这种千篇一律的效果 —— 俗称“转圈”. 本篇我们利用Flutter 的 PathMetric来玩几个有趣的 loading 效果. 效果1:圆环内滚动的球 如上图所示,一个红色的小球在蓝色的圆环内滚动,而且在往

  • Android补间动画基本使用(位移、缩放、旋转、透明)

    本文讲述了Android补间动画基本使用(位移.缩放.旋转.透明).分享给大家供大家参考,具体如下: 补间动画 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画 位移.旋转.缩放.透明 位移: 参数10指的是X的起点坐标,但不是指屏幕x坐标为10的位置,而是imageview的 真实X + 10 参数150指的是X的终点坐标,它的值是imageview的 真实X + 150 //创建为位移动画对象,设置动画的初始位置和结束位置 TranslateAnimation ta = new T

  • Android 补间动画及组合AnimationSet常用方法详解

    目录 补间动画 RotateAnimation 动画示例 ScaleAnimation 动画示例 TranslateAnimation 动画示例 AlphaAnimation 动画示例 AnimationSet 动画组合 动画示例 补间动画 Android常用的四种补间动画分别为RotateAnimation.ScaleAnimation.TranslateAnimation.AlphaAnimation,他们的父类为Animation,UML类图如下: 父类通用方法有: public void

  • Android编程创建与解析xml的常用方法详解

    本文实例讲述了Android编程创建与解析xml的常用方法.分享给大家供大家参考,具体如下: 今天我今天给大家讲解一下Android创建xml以及一些解析xml的常用方法. 首先是创建,我们用XmlSerializer这个类来创建一个xml文件,其次是解析xml文件,常用的有dom,sax,XmlPullParser等方法,由于sax代码有点复杂,本节只讲解一下dom与XmlPullParser解析,sax我将会在下一节单独讲解,至于几种解析xml的优缺点我就不再讲述了. 为了方便理解,我做了一

  • Android动画学习笔记之补间动画

    本文实例为大家分享了Android补间动画展示的具体代码,供大家参考,具体内容如下 首先看看补间动画的共同属性: Duration:动画持续的时间(单位:毫秒)   fillAfter:设置为true,动画转化在动画被结束后被应用  fillBefore:设置为true,动画转化在动画开始前被应用  interpolator:动画插入器(加速.减速插入器)  repeatCount:动画重复的次数  repeatMode:顺序动画(restart)/倒序动画(reverse)  startOff

  • Android动画之补间动画(Tween Animation)基础学习

    前言 之前说过了在Android中,动画Animation的实现有两种方式:Tween Animation(渐变动画)和Frame Animation(帧动画).渐变动画是通过对场景里的对象不断做图像变换(平移.缩放.旋转等)产生动画效果.帧动画则是通过顺序播放事先准备好的图像来产生动画效果,和电影类似. 小编也和大家分享了逐帧动画的基础知识,下面我们就来学习下Android中逐帧动画的基础知识. 原理 : 给出开始和结束两个关键帧,两个关键帧之间的插补帧是由计算机自动运算而得到的. 分类 :

  • Android动画之补间动画(Tween Animation)实例详解

    本文实例讲述了Android动画之补间动画.分享给大家供大家参考,具体如下: 前面讲了<Android动画之逐帧动画(Frame Animation)>,今天就来详细讲解一下Tween动画的使用. 同样,在开始实例演示之前,先引用官方文档中的一段话: Tween动画是操作某个控件让其展现出旋转.渐变.移动.缩放的这么一种转换过程,我们称为补间动画.我们可以以XML形式定义动画,也可以编码实现. 如果以XML形式定义一个动画,我们按照动画的定义语法完成XML,并放置于/res/anim目录下,文

  • android 帧动画,补间动画,属性动画的简单总结

    帧动画--FrameAnimation 将一系列图片有序播放,形成动画的效果.其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用 在Drawable文件夹下,创建animation-list为根节点的资源文件 <animation-list android:oneshot="false"> <item android:drawable="@drawable/img1" android:duration="100

  • Android帧动画、补间动画、属性动画用法详解

    在安卓开发中,经常会使用到一些动画,那么在开发中,如何使用这些动画呢? 帧动画:不是针对View做出一些形状上的变化,而是用于播放一张张的图片,例如一些开机动画,类似于电影播放,使用的是AnimationDrawable来播放帧动画 res/drawable <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.androi

  • Android控件Tween动画(补间动画)实现方法示例

    本文实例讲述了Android控件Tween动画(补间动画)实现方法.分享给大家供大家参考,具体如下: Android动画中的Tween动画:是把控件对象不断的进行图像变化来产生旋转.平移.放缩和渐变等动画效果. /** * 控件Tween动画 * * @description: * @author ldm * @date 2016-6-22 下午5:26:24 */ public class TweenActivity extends Activity { private SeekBar see

随机推荐