Android群英传笔迹-动画机制
视图动画-Animation
Veiw动画框架-Animation。
定义了透明度,旋转,缩放,位移等常见动画,控制的是整个View.
实现原理
每次绘制视图时,View所在的ViewGroup中的drawChild函数会获取View的 Animation的Transformation值,然后调用canvans.concat(transformToApply.getMarix()),通过矩阵变化完成动画帧,如果动画没有完成,则调用invalidate()函数,启动下次绘制来完成绘制。
对于动画事件,android也提供了相应的监听方法,可以通过
animation.setAnimaionListener方法来监听动画的开始,结束和重复事件
优点与缺点
视图动画使用简单,效率高,可以通过xml来描述动画,也可以通过代码来控制动画。但是缺点明显,与属性动画相比,视图动画没有交互性,即view通过动画改变位置后,事件的响应位置还是原来的位置,没有变化。简而言之,只是视觉效果改变,其他的都没有改变。如果是避免交互的场景,他还是比较好用的。
视图动画-动画集合
AnimatipnSet-可以将动画以组合的形式展现出来。
属性动画-Animator
视图动画 Animation 存在局限,只改变显示,而不响应事件。
属性动画可以通过属性的get set方法来真实的控制一个view的属性值,所以改变的不只是显示。它基本可以实现所有的动画效果。例如,一个view的移动动画,视图动画移动view后,响应点击事件的区域,还是view原来的位置,而属性动画,这个响应区域,随着动画的移动而移动。
Animator使用最多的就是 AnimatorSet和ObjectAnimator配合。
ObjectAnimator
使用ObjetAnimator可以进行更精化的控制,只控制一个对象的一个属性值,通过多个ObjectAnimator组合到AnimatorSet,形成一个动画。
ObjectAnimator可以自动驱动,可以调用setFrameDelay(int)设置动画帧的间隙时间,调整帧率,减少频繁画图,减少cpu资源消耗。
ObjectAnimator的使用见书里。
注意:
对于被控制的属性,必须有set和get方法,因为ObjectAnomator内部会通过java反射来取得并修改该属性。
ObjectAnimator animator = ObjectAnimator.ofFloat(
view,
"translationX,
300);
animator.setDuration(300);
animtor.start();
PropertyValuesHolder
类似于视图动画中的AnimationSet,针对同一个对象,多个属性的动画情况
PropertyValuesHoler h1= PropertyValuesHoler.ofFloat("translationX",300f);
PropertyValuesHoler h2= PropertyValuesHoler.ofFloat("translationY",300f);
PropertyValuesHoler h3= PropertyValuesHoler.ofFloat("ScaleX",300f);
ObjectAnimator
.ofPropertyValuesHolder(view,h1,h2,h3)
.setDuration(1000)
.start()
ValueAnimator
ValueAnimator 不提供任何动画效果,更像是一个数值发生器,用来产生一定规律的数值,然后供调用者使用,控制动画过程的实现。ObjectAnimator继承了ValueAnimator。
个人认为,这是精细化动画的实现过程,数值每改变一次,被监听到,然后更改view的属性。
使用例子
ValueAnimator animator=ValueAnimator.ofFloat(0,100);
animator.setTarget(view)
animator.addUpdateListener(new AnimatorUpadateListener(){
@Override
public void onAnimationUpdate(ValueAnimator animation){
Float value =(Float) animation.getAnimatedValue()
//使用这个value,对view的属性进行更改
}
}
动画事件的监听
一个完整的动画具有 Start,Repeat,End,Cancle四个过程,Android提供了接口(AnimatorListenner),可以监听这四个过程。具体内容见书中
AnimatorSet
和PropertyValuesHolder一样。对同一个对象多个属性实现动画效果,但是,它能更精确的控制顺序。具体内容见书中。
在xml中使用属性动画
可以将通话直接写在xml中,然后在代码中调用。具体内容见书中。
View的animate方法
android3.0后,谷歌为view增加了animate方法来直接驱动属性动画。
view的animate方法可以看做是属性动画的一种简写方式。如果是简单的动画效果,可以直接使用view的animate方法来实现。
Android布局动画
布局动画,就是作用在viwgoup上,给viewgroup添加view时,有一个动画过渡效果。
布局动画方式一
在viewGroup的xml文件中,添加属性
abdroid:animateLayoutChanges="true"
这样使用的是系统的 逐渐显示的效果,不可自定义.
布局动画方式二
使用LayoutAnimationController类自定义一个子类的view的过渡效果.
LinearLayout ll =fndByID(R.id.xx);
ScaleAnimation sa=new ScaleAnimation(0,1,0,1);
sa.setDuration(2000);
LayoutAnimationController la=new LayoutAnimationController(sa,0.5F);
//LayoutAnimationController.ORDER_NORMAL 顺序
//LayoutAnimationController.ORDER_RANDOML 随机
//LayoutAnimationController.ORDER_REVERSE 反序
la.serOrder(LayoutAnimationController.ORDER_NORMAL);
ll.setLayoutAnimation(la);
插值器 interpolators
动画的重要概念,定义动画的变换速率。
自定义动画
见书本内容。
SVG矢量动画机制
SVG图形
谷歌在安卓5.x中增加了对SVG图形的支持。SVG是可伸缩矢量图形,使用XML定义图形,在放大和改变尺寸的情况下,图片质量不会损失。
Bitmap需要为不同分辨率设计多套图标,但SVG则不需要。
其实我们在开发过程中,使用到一些图标就可以是SVG格式的,例如从阿里巴巴图标库中下载的图标。
path标签
使用path标签创建svg,就像是用指令的方式来控制画笔。例如常见的
M=moveto(M x,y),L=linti(L X,Y)等等。
注意:
坐标轴以(0,0)为中心,x轴水平向右,y轴垂直向下
所有指令均可大小写,大写表示绝对坐标,小写表示相对坐标
指令与数据间的空格可以省略
同一指令多次出现,只能用一次
svg常用一次svg编辑器知识指令见书中。
Android中使用SVG
安卓5.x中提供 VectorDrable(基于xml创建图像)和AnimateVectorDrable(实现动画效果)来支持SVG。
VectorDrable
主要用于在xml中创建静态svg图像。
path是svg树形结构的最小单位,可以通过group将不同path组合。具体例子见书中。
AnimatedVectorDrawable
AnimatedVectorDrawable就像胶水,是用来连接静态VecorDrable和动态objetAnimator的。
在标签中声明对objetAnimator的使用,并为其指定作用的path或者group(通过name属性来辨别)。
objetAnimator就和上文讲的,在xml中使用属性动画一样。
轨迹动画
android对svg的支持,带来许多好玩的特效。将propertyName指定为 trimPathStart,就可以实现轨迹画图的效果。即像用笔慢慢的画出图形,这样的效果。
书里有几个的svg动画的例子,学习的时候结合例子看,效果会好一些