最近项目迭代,UI出了一个交互,有点类似开源项目MaterialEditText那种效果,于是自己把android动画相关的给大致过了一遍,做个笔记。
Animation
android的动画分位3种:
- View Animation(组件动画)
- Property Animation (属性动画)
- Drawable Animation (帧动画)
1.View Animation
组件动画,也是最基本的动画,主要包括4种:
- alpha (渐变)
- scale (缩放)
- translate (平移)
- rotate (旋转)
View动画,主要实现方式有两种:
一种是通过xml编写相关动画及其属性,在java代码中一般通过AnimationUtils导入动画,其他的一些方法则是将动画当成参数传入实现,例如activity的overridePendingTransition方法。另一种就是直接在java代码中通过相关动画的类创建对象设置属性来实现。
下面简单例举一下每一种动画相关的属性(XML文件的形式,在java代码里面,基本都具有set方法):
alpha
android:fromAlpha="0.0" 开始透明度
android:toAlpha="1.0" 结束透明度
scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator" 速率控制
android:fromXScale="1.0" ——> 初始x位置
android:toXScale="1.4" ——> 结束x位置
android:fromYScale="1.0" ——> 初始y位置
android:toYScale="0.6" ——> 结束y位置
android:pivotX="50%" ——> x方向上缩放位置
android:pivotY="50%" ——> y方向上缩放位置
android:fillAfter="false" ——> 结束后是否停留在结束位置
translate
android:fromXDelta="float" 开始x位置
android:toXDelta="float" 结束x位置
android:fromYDelta="float" 开始y位置
android:toYDelta="float" 结束y位置
rotate
android:fromDegrees="0" 开始角度
android:toDegrees="-45" 结束角度(正为顺时针,负为逆时针)
android:toYScale="0.0" 结束y位置
android:pivotX="50%" 旋转x位置
android:pivotY="50%" 旋转y位置
android:startOffset="700" start方法调用后的等待时间
4种动画都具有的一些公共属性(不全,仅举例说明)
android:duration="500" 动画周期
android:repeatCount="-1" 循环次数(-1代表无限循环)
android:repeatMode="reverse" 循环模式
基本的view动画,也可以多个一起组合成为组合动画,在xml文件的形式为set标签,java代码里面通过AnimationSet来实现。无论是AlphaAnimation,ScaleAnimation,TranslateAnimation,RotateAnimation还是AnimationSet都是继承于Animation类。
对于view动画的每个Animation类,都会提供相对应的animation listener,里面有三个主要回调方法,就是动画开始前,动画结束后,动画重复。
2.Property Animation
基本的view动画,具有一定的限制性,因为是view动画所以作用的对象是android的组件。在自定义的组件里面,有时会通过一个可变的对象来管理组件的属性,这个可变的对象,控制这这个自定义组件的动画,这种场景下简单的view动画是无法实现的。
属性动画有以下三个相关类:
- Animator
- ObjectAnimator
- ValueAnimator
ValueAnimator
这个类是最主要的一个类,基本功能都实现了,继承于Animator类,被ObjectAnimator继承,主要功能就是在初始值到结束值之间做计算,做一个过渡。主要方法有ofFloat,ofInt,ofArgb,参数为一个集合。
ObjectAnimator
这个类可以对任意对象的任意属性进行操作,也是最常用的一个类。比如其中一个方法ofFloat
public static ObjectAnimator ofFloat(Object target, String propertyName, float… values)
target为要操作的对象,property为属性名,后面的values同ValueAnimator的参数。
说说这次用到的一些属性名称:
PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("TranslationY", 0,-DensityUtil.dip2pX(mContext,23)); // 平移方向
PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 1.0f,0.7f); // X缩放方向
PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("scaleY", 1.0f,0.7f); // Y缩放方向
PropertyValuesHolder holder4 = PropertyValuesHolder.ofFloat("pivotX", 1.0f,1.0f); // 缩放位置(前后都是1表示x坐标不变)
中间用到的PropertyValuesHolder为一个辅助类,最后通过AnimatorSet的ofPropertyValuesHolder方法,将这些holder添加在一起。使用holder的时候,ObjectAnimator还提供了一些动画顺序的方法,类似after,before,with等,这个酌情使用。
说到这次UI设计的组件,最后用的解决方案,就是通过属性动画来完成,因为属性动画有一个很棒的方法,就是reverse,在第一次animator结束的时候,停留在结束的位置,第二次可以从结束位置再次回到初始位置,完成了所需要的功能。
3.Drawable Animation
帧动画,一般在对话框的场景下会用到,每一帧都是一个drawable,在xml中,使用animation-list标签和item标签来实现。这个不做赘述。
#结言
主要是在做需求的时候,对所了解的一些知识做一个归纳总结,内容肯定不是非常全面,大概知道了框架,用的时候会有一个思路和概念。
下面主要比较一下view动画和property动画的区别:
- Property Animation是android3.0才加上的内容,对于API11以下的版本,不能使用,View Animation则通用
- Property Animation适用于所有对象,View Animation则是仅限于view
- Property Animation使用xml实现时,xml文件存放在animator文件夹下;View Animation使用xml实现时,xml文件存放在anim文件夹下
- 体系结构不一样,属性动画主要是Animator类,组件动画主要是Animation动画
最后记录一个开源库,https://github.com/JakeWharton/NineOldAndroids ,这个开源库主要是兼容android3.0以下版本也能使用Property Animation。