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动画的例子,学习的时候结合例子看,效果会好一些

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值