动画深入进阶

一. PropertyValuesHolder与Keyframe

1.引入

        ValueAnimator和ObjectAnimator除了常用的ofInt()、ofFloat()、ofObject()函数外,还有ofPropertyValuesHolder函数。如下:

    //ObjectAnimator 的   多参说明可以同时实现多个动画
    public static ObjectAnimator ofPropertyValuesHolder(
    Object target,PropertyValuesHolder... values)

    //ValueAnimator 的
    public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values)

2.PropertyValuesHolder含义:保存动画过程中所需要操作的属性和对应的值。常用方法ofInt、ofFloat、ofObject和上面的属性动画类似,不做介绍。

3.Keyframe:关键帧(在特定时间点和位置的关键帧)

通过ofKeyframe方法生成PropertyValuesHolder对象,如下:

// propertyName 操作的动画属性  Keyframe 可变参数,关键帧    
public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)

用法:

第一步:生成Keyframe对象;

第二步:利用ofKeyframe方法生成PropertyValuesHolder对象;

第三步:利用ofPropertyValuesHolder方法生成对应的Animator。

Keyframe frame0 = Keyframe.ofFloat(0f,0);//表示动画在进度为0的时候动画所在的数值为0
keyframe frame1 = Keyframe.ofFloat(0.1f,-20f);//表示动画在进度为0.1的时候动画所在的数值为-20f
keyframe frame2 = Keyframe.ofFloat(1,0);//表示动画在进度为1的时候动画所在的数值为0
PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("rotation",frame0,frame1,frame2);
Animator animator = ObjectAnimator.ofPropertyValuesHolder(mImages,frameHolder);
animator.setDuration(1000);
animator.start();

扩展:Keyframe也可以设置时间插值器。

 

二.ViewPropertyAnimator:为view的动画提供更加便捷的操作

1.基本用法:

textView.animate().alpha(0f);

2.注意点:

①.以调用view的animate()为开始。

②.自动开始,不用显示的调用start方法。

③.流畅的接口,builder模式。

④.可以设置多个属性然后同时进行动画。

3.原理:

ObjectAnimator是使用反射或者jni技术

ViewPropertyAnimator会根据预设的每一个动画帧计算出对应的所用属性值,并设置给控件,然后调用一次invalidate()进行重绘

4.利弊及用处

ObjectAnimator更加灵活方便的给任何对象及属性做动画。

ViewPropertyAnimator适用于为view多个属性设置动画。

 

三.为ViewGroup内的组件添加动画

1.三种方法:

①.layoutAnimation和gridLayoutAnimation

layoutAnimation用于listView、RecycleView,gridLayoutAnimation用于GridView。缺点是只用在创建的时候有动画,再添加数据不会用动画。

②.android:animateLayoutChanges属性

为需要ViewGroup组件的子view添加动画,用法就是在布局文件ViewGroup中添加android:animateLayoutChanges=true,缺点是动画不能自定义,只能用默认动画。

③.LayoutTransition

可以实现为ViewGroup的子view添加动画,并且动画可以自定义。

2.LayoutTransition用法

①.创建LayoutTransition实例

②.创建动画并设置到LayoutTransition中

③.将ViewGroup设置LayoutTransition的实例

 

四.利用PathMeasure实现路径动画

1.PathMeasure:可以计算出指定路径的信息,比如:路径总长度、指定长度对应的坐标点。

2.简单使用

①.getLength:路径长度

②.isClosed:计算路径长度时是否闭合

③.nextContour:跳转到下一条曲线

④.getSegment:截取path的某个片段(用于动画逐渐显示出来)

④.getPosTan:得到路径上某个长度的位置和正切值(y/x的值)  (用于当前已知的曲线然后获取到对应的位置然后让图标跟随位置移动,比如:箭头图标跟随圆形进度条转动)

⑤.getMatrix:类似上面,只是可以选择得到的是位置还是正切值还是位置和正切值。

3.总结:

path实现路径,PathMeasure实现路径的动画(可能借助其他的比如:Matrix),最后drawXXX绘制。

 

五.SVG动画

1.SVG定义:可缩放矢量图形

2.SVG相比Bitmap的好处:

①.SVG使用xml格式定义,可被非常多工具修改。

②.SVG由点来存储,由计算机根据点的信息绘图,不会失真,无需根据分辨率适配多套图标。

③.SVG的占用空间明显比Bitmap小。一般20KB

④.SVG可以转换成Path路径,与Path动画结合可以形成更丰富的动画。

3.SVG动画:可以通过animator-vector将属性动画和Vector图像(SVG图像)关联。

你可能感兴趣的:(自定义view,android,ui)