本章讲解:view动画,帧动画,动画使用特殊场景,属性动画,动画使用注意事项
1.view动画:平移缩放旋转淡入淡出动画(补间动画),帧动画。
补间动画动画集合示例:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true" //动画结束后是否停留在结束位置
android:duration="1000" //动画持续时间
android:shareInterpolator="true"> //是否共享差值器
<alpha //透明度动画(淡入淡出动画)
android:fromAlpha="0.1" //透明度起始值 比如0.1
android:toAlpha="1.0"/> //透明度结束值 比如1
<scale //缩放动画
android:fromXScale="0.5" //水平缩放的起始值 比如:0.5
android:fromYScale="0.5" //竖直方向的起始值 比如:0.5
android:toXScale="1.0" //水平方向的结束值 比如:1.0
android:toYScale="1.0" //竖直方向的结束值 比如:1.0
android:pivotX="1.0" //缩放的轴点的x坐标。
android:pivotY="1.0"/> //缩放的轴点的y坐标。
<translate //平移动画
android:fromXDelta="0.1" //平移动画水平方向起始值
android:fromYDelta="0.1"
android:toXDelta="1.0" //平移动画水平方向结束值
android:toYDelta="1.0"/>
<rotate //旋转动画
android:fromDegrees="0" //旋转动画开始角度 比如:0
android:toDegrees="180" //旋转动画结束角度 比如:180
android:pivotX="1" //轴点x坐标值
android:pivotY="1" />
</set>
2.帧动画:顺序播放一组预先定义好的图片,类似电影播放。对应标签<animation-list>。缺点:容易引起oom
3.自定义view动画。
流程:继承Animation,重写initialize和applyTransformation方法,initialize做一些初始化操作,applyTransformation做矩阵变换的操作。
4.view动画使用的特殊场景。
①.LayoutAnimation:LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,当他的子元素出场会具有此动画,一般用于ListView,RecycleView。对应标签符<LayoutAnimation>
②.Activity的切换效果。
主要用到overridePendingTransition(int enterAnim,int exitAnim),注意这个方法在startActivity或者finish之后被调用才生效。
5.属性动画:在一段时间内完成对象的一个属性值改变成另一个属性值。
①.比如:改变x坐标位置进行平移,改变backgroundColor颜色值让背景色实现渐变,对view做平移缩放旋转淡入淡出等。
示例xml如下
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially|together"> //sequentially 子动画顺序播放 together 子动画同时播放
<objectAnimator //ObjectAnimator
android:propertyName="string" //属性名
android:duration="int"
android:valueFrom="float|int|color" //表示属性的起始值
android:valueTo="float|int|color" //表示属性的结束值
android:startOffset="int" //动画延时,动画开始后多少毫秒真正播放动画
android:repeatCount="int" //动画重复次数
android:repeatMode="restart" //动画重复模式
android:valueType="colorType"/> //属性类型
<animator //ValueAnimator
android:duration="int"
android:valueFrom="float|int|color"
android:valueTo="float|int|color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode="restart"
android:valueType="colorType"/>
</set>
②.插值器和估值器。
TimeInterpolator:时间插值器。根据当前流逝时间的百分比计算出当前属性改变的百分比,可以实现Interpolator接口来实现一个自定义的时间插值器。
TypeEveluator:类型估值器。根据当前变化的百分比(即时间插值器返回的值),计算出属性改变后的值。可以实现TypeEveluator接口来实现一个自定义的类型估值器。
③.属性动画的监听器(AnimatorUpdateListener和AnimatorListener)
AnimatorListener监听开始结束取消和重复播放。
AnimatorUpdateListener监听整个动画过程的进度
④.对任意属性进行动画。
比如对Button的width属性进行动画
ObjectAnimator.ofInt(mButton,"width",500).setDuration(500).start();
发现上述动画没有效果,因为setWidth方法不是对宽度设值的,源码中如下:
@android.view.RemotableViewMethod public void setWidth(int pixels) { mMaxWidth = mMinWidth = pixels; mMaxWidthMode = mMinWidthMode = PIXELS; requestLayout(); invalidate(); }
对属性abc做动画并且想让动画生效需要满足以下两点:
(1).object必须提供setAbc方法,如果动画需要传递初始值,还需要getAbc方法,因为系统需要获取abc的属性值(如果不满足直接crash)
(2).object的setAbc对属性abc所做的改变必须通过某种方式反映出来,比如:ui带来改变(如果此条不满足,不会有任何效果也不会crash)
以上问题官方告诉我们三种解决方式:
(1).给你的对象加set和get方法,如果你有权限的话。
(2).添加包装类包装原始对象,间接提供get和set方法。
(3).采用ValueAnimator,监听动画过程,自己实现属性的改变。
6.使用动画注意事项:
①.oom问题:主要是帧动画中,易出现oom,可以将动画压缩或者才有surfaceView
②.内存泄漏:属性动画中有一类无限循环的动画,在activity退出要及时停止。
③.view动画问题:在view动画结束后需要clearAnimation清除动画,否则可能view调用setVisibility(GONE)失效。
④.view动画结束后真正的位置还是原先的位置,属性动画结束后真正的位置是动画完成的位置。
⑤.使用动画过程建议开启硬件加速,这样更加流畅。