精简介绍Android中的动画,主要介绍用法。
动画种类
包括了:补间动画、逐帧动画、属性动画,前两者统称为视图动画。
补间动画
包括了平移、旋转、缩放和透明度四种,每种动画支持xml和代码设置。另外还有一种组合动画,就是将四种基础动画进行任意组合。
PS:注意补间动画后其实View的事件响应区域并没有发生改变,也就是如果使用平移动画,平移后最终视图停下的位置,这时候并不响应点击,类似的情况还包括了:放大或缩小的View,透明度为0的View,其实可点击位置和动画前一致。
特殊应用场景:
Activity切换,使用overridePendingTransition
方法;
Fragment切换,使用FragmentTransaction
的setCustomAnimations
方法。
动画属性值
将所有的动画xml放在资源文件夹下的anim文件夹下。
平移、旋转、缩放、透明度和组合动画对应的标签分别为translate、rotate、scale、alpha和set。
公共属性含义
android:duration 时长
ndroid:startOffset 延迟开始时间,单位ms
android:fillBefore 完播视图是否会停留在初始位置,默认为true
android:fillAfter 完播视图是否会停留在结束位置,优先于fillBefore值,默认为false
android:repeatMode 重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart
android:repeatCount 重放次数,-1为无限重复
android:interpolator 动画插值器,@android:anim可以选择Android提供的
属性值的距离表示方式:固定数字、百分比、父布局百分比。
为数字时(如50),基于View的左上角偏移50px的点,代码中是Animation.ABSOLUTE;
为百分比时(如50%),基于View的左上角偏移自身宽或高50%,代码中是Animation.RELATIVETOSELF;
为百分比p时(如50%p),基于View的左上角偏移父布局宽或高50%,代码中是Animation.RELATIVETOPARENT。
平移动画
android:fromXDelta 水平方向起始值
android:toXDelta 水平方向结束值
android:fromYDelta 垂直方向起始值
android:toYDelta 垂直方向结束值
旋转动画
android:fromDegrees 开始角度
android:toDegrees 结束角度
android:pivotX 旋转点x坐标
android:pivotY 旋转点y坐标
缩放动画
android:fromXScale X方向开始缩放倍数
android:toXScale X方向结束缩放倍数
android:fromYScale Y方向开始缩放倍数
android:toYScale Y方向结束缩放倍数
android:pivotX 缩放点x坐标
android:pivotY 缩放点y坐标
透明度
android:fromAlpha 开始透明度
android:toAlpha 结束透明度
代码设置动画
加载动画资源文件
val animation = AnimationUtils.loadAnimation(this, R.anim.test_animation)
动画开始
btn.startAnimation(animation)
动画结束
btn.clearAnimation()
动画对象
TranslateAnimation
、RotateAnimation
、ScaleAnimation
、AlphaAnimation、AnimationSet
动画监听器,调用Animation
对象的setAnimationListener
方法即可,其中Listener
可以使用AnimatorListenerAdapter
,这样不需要重写所有的接口方法。
逐帧动画
用一组图片,然后控制每张图片的停留时间,来形成一个动画。
同样在anim文件夹下创建动画文件,然后使用animation-list
为根标签。
android:oneshot 设置是否只播放一次,默认为false
设置每帧动画
涉及对象AnimationDrawable
,直接获取view的drawable对象,然后强转为AnimationDrawable
,其中start动画开始,stop动画结束。
不过这种动画方式容易引起OOM,因为需要加载大量的图片资源。
属性动画
解决视图动画的痛点:视图的属性并不改变,容易给用户造成错觉;动画形式单一。
核心类:ValueAnimator和ObjectAnimator。
使用ValueAnimator,其本质并不修改View的相关属性,只是提供一个进度值。
创建,都可以传多个参数
ValueAnimator.ofInt(int value)
ValueAnimator.ofFloat(float values)
ValueAnimator.ofObject(int values)
动画设置方法
setDuration
:动画时长
setStartDelay
:开始延时时长
setRepeatCount
:动画重复次数
setRepeatMode
:动画重复模式
addUpdateListener
:核心方法,在接口中通过animation.getAnimatedValue()
获取当前值,然后对View中的某些属性进行设置。
常用的属性:width、height、alpha、x、y、scaleX、scaleY等,在设置完成后调用view.requestLayout()方法。
也可以通过xml设置,在res文件夹中的animator文件夹下。
其中属性包含了视图动画中所有的基本属性,特殊属性包括了:
根标签:animator
android:valueFrom 初始值
android:valueTo 结束值
android:valueType 变化值类型,可选floatType & intType
加载xml文件,直接将对象强转为ValueAnimator
。
AnimatorInflater.loadAnimator(this, R.animator.test_animator)
ObjectAnimator,对ValueAnimator进行封装,直接作用于View上,更改其中的属性值。
ObjectAnimator.ofFloat(Object object, String property, float ....values)
object,一般传入View,property传入view的属性。
xml形式,使用objectAnimator
根标签,特殊属性:
android:valueFrom
:初始值
android:valueTo
:结束值
android:valueType
变化值类型 :floatType & intType
android:propertyName
对象变化的属性名称
常用属性:alpha、rotation、translationX、scaleX、translationY、scaleY
注意,如果想要对象对话生效,需要满足两个条件:提供属性set方法和对属性的改变必须通过某种方法反映出来。
动画修改View的宽高
使用ValueAnimator,动态修改LayoutParam中的width和heigh;
给View进行包装一下
ObjectAnimator.ofInt(wrapper, "width", 500)
组合动画:AnimatorSet
ObjectAnimator简写
view.animate().scaleX(1.0f).scaleY(1.0f).setDuration(200).start()
欢迎关注微信公众号:SimFG,让我们一起学习一起进步