view中除了必要的移动之外,也可以使用动画来完善视觉效果。android中的动画在2.3之前只有帧动画和补间动画。3.0之后就加入了属性动画。其实说到动画是什么?就是一个连续的view的集合。帧动画是不断的切换view,补间动画就是不断的绘制两个状态之间的view,形成补间内容。属性动画实际上是加强了动画,在之前的基础上更加灵活,几乎实现了任何有属性的对象的动画效果。其实原理也很简单就是两个状态之间的不断变化。

tip:关于3.0之前动画插值器的历史:2.3的时候补间动画的插值器interpolater接口有getInterpolation(float input)方法,后来3.0之后就是去掉了,然后做了一个父类接口TimeInterpolator,我不知道google工程师门有什么意图,但是我感觉就是为了扩展,说明现在的interpolater都是基于时间上的插值,并且这个插值器知道能是使用在alpha, scale, translate, rotate的极少的属性上。

动画是基于两个状态的不断变化而形成的,这个变化一定有变化规律,这个规律就是用interpolater来得到的值。这个也叫做插值器,就是这个作用。说到动画就不得不提补间动画和属性动画的区别:为什么补间动画只能支持alpha, scale, translate, rotate。愿意就是生成这个两种动画的机制不同。补间动画是通过把动画设置给view然后通过view的不断绘制,期间改变view画的位置然后得到的动画效果。这个效果是不改变属性的,也就是说只是改变了view出现的位置,而没有改变具体的属性。但是属性动画就不同了,他通过改变的是你传递进去的属性值,也就是把两个属性值要进行不断的改变,最后实现内容补间。这也就是为什么属性动画更加强大了,因为他更加抽象粒度更小。小到了属性值。补间动画操作的是view。

补间动画:

要实现一个补间动画有两种方式,代码和xml。了解了view的绘制,实际上任何的一个xml配置的项目你都明白可以通过代码来实现,也就是说xml最终都要使用代码设置对象来实现处理。xml配置的时候,要使用AnimationUtill来进行load进来一个xml,其实就是转化为一个animation对象。然后这个对象可以设置到view中,但是你发现了一个奇怪的现象,view中只是设置了animaiton,但是draw的时候根本就没有使用,实际上又想起一个问题来,为什么viewgroup中没有让复写draw?其实这里有一个drawchild方法就是绘制view的时候所注意的东西。里面包含了动画的绘制,为什么要这样?实际上view的动画是由viewgroup来实现的,viewgroup的会操作view的画布来进行矩阵变换。然后做出动画的动作。这里也就是说明了为什么不会改变view的属性,他变换的是view的canves。而不是属性。

这里还有一个就是animation里面的transfromation,这个是用来改变绘制矩阵的,transfromation里面有一个alpha对象和matrix矩阵是用来操作canves的。也就是说当你使用animation的时候,会将transfromation的属性不断地按照interpolator里面的变化规律来进行变换,这样得到的值还是一个transfromation,然后view的canves就按照transfromation里面的数据矩阵和alpha值来进行了一个变换,这样就形成了动画。这里也就是为什么补间动画只有那4种了。

tip:在使用动画的时候可能会遇到传递type,这个type有3个:1.绝对的absolute,这个实际上就是说你传递的值是绝对的像素。2相对于自己,这里说的意思就是移动和变换的参考都是自己,比如移动1,就是移动1个自己的width。3相对于父类,移动时候会参考父类布局,移动的时候会移动父类布局的宽度。

知道了动画的原理之后,还有几个类比较重要:1.animationset,这个可以把多个动画组合在一起使用。使用的时候会根据你的组合顺序来进行变换动画,其实就是绘制canves。2.layoutAnimation,这个实际就是layout可以再布局的时候利用layoutanimation来进行一个布局动画的显示,但是假如你还设置了里面的view的动画,就会导致view的动画不可用。

属性动画:

还是先介绍一下除了属性动画的插值器,还有一个计算器TypeEvaluator<T>里面有一个函数:public T evaluate(float fraction, T startValue, T endValue);意思就是说fraction是一个变换比例值,从startValue变化到endVaule。

属性动画还是有自己的类,就是ValueAimator,属性动画不同于补间动画,他是基于本身的一个animationHandler来实现的,也就是说属性动画所在的线程必须有looper。当你开始动画的时候,就会调用start,这个时候就会发送一个开始的消息。然后会根据你的插值器和计算器计算的时间比率和属性变化率进行一个属性值的渐变。然后在帧消息函数中做出处理。这样你的属性值就是渐变了。当然要引起视觉变化就要使用animationupdatelistener来进行一个变化的监听。可以获得当前的属性的值。

在valueanimation基础上又封装了objectanimation。这个要使用必须有2个条件:1.有可以使用setget设置的属性,2,属性可以引起变换。当然第二个条件不是必须的,但是你要变换出效果就必须的了。另外可能有这样的情况,我的view没有这个属性set,get方法,这个时候就要使用包装来自己定义属性。或者是你也可以直接使用valueanimation来进行变换。

注意的就是属性变化变化的是属性,当你是使用view来进行属性变换的时候,也就是说你的view属性操作了,不仅仅是操作你的canves了。

view间的动画切换:viewfliper,这个是主要用来进行两个view间的切换动画的实现的,可以自动播放。实际上就是里面有一个消息处理函数,然后发送延时消息,而不断的切换当前显示的view,在切换的时候使用预先设置好的动画效果。由于是加强了,考虑了多种情况,尤其是在屏幕锁屏的时候关闭view切换,使用了boolean标志位来进行区分mstop和mstart,这一点是值得学习的。这也是一个很方便的类。

android view : 动画的更多相关文章

  1. 虾扯蛋:Android View动画 Animation不完全解析

    本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...

  2. Android View动画

    Animation TypeEvaluator View的animate方法 ValueAnimator ObjectAnimator AnimatorSet 使用xml来创建动画 animation ...

  3. Android View动画效果—透明效果,旋转效果(二)

    一:动画效果 方法一:动画效果用AlphaAnimation类.直接加入 AlphaAnimation aa = new AlphaAnimation(0,1); //设置透明度 aa.setDura ...

  4. 有趣的动画视图集合:Android View Animations

    Android View Animations这个项目收集了各种有趣的动画效果. 所有效果: Attension Flash, Pulse, RubberBand, Shake, Swing, Wob ...

  5. 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动

    在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...

  6. Android(java)学习笔记200:Android中View动画之 XML实现 和 代码实现

    1.Animation 动画类型 Android的animation由四种类型组成: XML中: alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动 ...

  7. Android移动view动画问题

    http://www.cnblogs.com/eoiioe/archive/2012/08/29/2662546.html Android写动画效果不是一般的麻烦,网上找了好久,终于解决了动画的问题, ...

  8. Android 动画具体解释View动画

    为了让用户更舒适的在某些情况下,利用动画是那么非常有必要的.Android在3.0一旦支持两种动画Tween动漫Frame动画.Tween动画支持简单的平移,缩放,旋转,渐变.Frame动画就像Gif ...

  9. Android动画-View动画

    View动画 Android动画分为三类:View动画,帧动画,和属性动画.帧动画也是View动画的一种. View动画的作用对象是View,之所以强调这一点是因为其作用对象有别于Android的另一 ...

随机推荐

  1. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

  2. java selenium (六) XPath 定位

    xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. 阅读目录 什么是xpath xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面, ...

  3. IIS7 404 模块 IIS Web Core 通知 MapRequestHandler 处理程序 StaticFile 错误代码 0x80070002

    <system.webServer> <!--添加--> <modules runAllManagedModulesForAllRequests="true&q ...

  4. http——tinyhttp分析

    1.前言: 1)tinyhttpd是一个500行+的http服务器 2)支持迭代和多线程并发两种服务器模型 3)支持GET和POST方法 4)支持CGI(fork.execl方式) 5)虽然响应的ht ...

  5. 使用expect脚本语言写一键发布服务(代码发布、所有服务重启)

    互联网服务有很多台服务,但是在上线的时候需要将这些服务版本都更新与个个都重启,下面的脚本语言,就是一键发布服务~ 1.在/home/weihu/deploy/ 目录下建下publish .publis ...

  6. SharpDevelop学习笔记(5)—— AddIns系统详解

    在所有的插件被加载到指定的扩展点后,插件树就被创建完毕了, 但是,我们知道,插件树创建后,每个插件在插件树的位置在就固定的,但是,如果某些情况下,我们希望一些插件不可使用或应该隐藏起来, 或者说有的插 ...

  7. 清华微积分-1_Ch1习题

    U3-1 Here are some sets: (1) R both and (2) ∅ both and (3) (1,+∞) open set (4) [−1,0]  closed set, - ...

  8. js拖拽效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 两个七牛app上传小脚本

    把要更新的app放到/home/data下面 安卓: cat upload_apk.sh #!/bin/bashUser=xxxxx@qq.comPass=xxxxxxqrsctl-v3.1.2016 ...

  10. SQL server存储过程语法及实例(转)

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...