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. Java开发工具安装步骤内容如下

    Java开发工具安装步骤内容如下 安装 开发工具 STS 链接下载网址 eclipse 链接下载网址 JDK安装 jdk链接下载地址 Marven环境 marven链接下载地址 Tomcat tomc ...

  2. sphinx全文检索功能 | windows下测试 (一)

    前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在linux环境下的安装使用,当然,作为生产环境很有必要部署在* ...

  3. hihoCoder#1121

    刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正. 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我 ...

  4. String Date Calendar之间的转换

    1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDa ...

  5. eap-md5

    eap-md5       文件路径 用途 示例 备注 #gedit /usr/local/etc/raddb/sites-available/default #gedit /usr/local/et ...

  6. 软件测试第四周--关于int.parse()的类型转换问题

    先来归纳一下我们用过的所有类型转换方法: 1. 隐式类型转换,即使用(int) 直接进行强制类型转换.这种方法的优点是简单粗暴,直接指定转换类型,没有任何保护措施,所以也很容易抛出异常导致程序崩溃.当 ...

  7. 通过FEDERATED存储引擎跨实例访问数据

    通过FEDERATED存储引擎同步两实例间的表数据需求情景:实例1中A库中的三个视图是实例2中的B库所依赖的,B需要A库中三个视图的实时数据.方案:通过FEDERATED来完成跨势力的查询FEDERA ...

  8. 探索javascript----浅析js模块化

    引言: 鸭子类型: 面向对象的编程思想里,有一个有趣的概念,叫鸭子类型:“一只鸟走起来像鸭子.游起泳来像鸭子.叫起来也像鸭子,那它就可以被当做鸭子.也就是说,它不关注对象的类型,而是关注对象具有的行为 ...

  9. UITableView去掉section的header的粘性

    思路:若header的高度为25,在滑动的时候将scrollView的内容偏移量上衣25,其实他还是粘在上面只不过我们看不到他了. ///---用于判断往上滑还是往下滑 var deltaY:CGFl ...

  10. Hadoop原理介绍

    Hadoop核心之HDFS 架构设计   老嗨 2015-09-18 16:55:00 浏览225 评论0 摘要: 概述:HDFS即Hadoop Distributed File System分布式文 ...