Android源码分析--动画框架AnimatorSet

  一提到android的动画,一定会涉及到AnimatorSet,因为他太好用了。它所封装的接口让很多复杂的动画叠加变得容易。

  AnimatorSet是继承于Animator这个是非常重要的,因为AnimatorSet可以不停的叠加自身,最重要的是他本身就是一个Animator。

  我们看一下他播放动画的方法,可以看到它返回的一个Builder的对象,可以推断它是使用建造者的形式,不断迭代动画。

  我们看一下他实际构造的时候使用,保存在mCurrentNode的Node对象里面,Node应该是节点的意思。

  每个动画都应该由节点构成

  其Builder里面存在着三种排序,with,before,after(字面意思应该都很清晰)

  (1)with的节点可以看到他是通过Dependency的方法来填充到mCurrentNode里面的,很明显with是并行的

  我们可以看到Dependency是只有WITH和AFTER两个时序。

  (2)当使用before的时候,相对于mCurrentNode是node节点之后,所以传入mCurrentNode到里面

  (3)当使用after的时候,相当于node节点是mCurrent节点之后,所以传入node到里面

  使用after延时,其实只是使用一个虚设一个ValueANimator来设定延时时间。

  然后我们看一下动画叠加真正的做法。

  (1)playTogethor其实是使用with循环的叠加,其参数是不定量的数组的items

  我们可以传入Collection的对象,意味着我们可以传入一个列表的Animator

  (2)playSequentially是不断使用before来将动画放在之后叠加

  setTarget的方法是循环获取node节点的animator动画,终节点通过ObjectAnimator来设置view目标

  setInterpolator设置时间插值器,这个插值器最后会在start的方法中是使用

  我们接下来看一下动画播放的流程

  (1)start的方法会先设置一些标志位,然后通过遍历节点node的animator对象来设置播放同步为false

  遍历设置每个动画对象的运行时间

  还会设置每个对象的时间插值器

  当使用play,playTogethor,playSequentially的时候还会标志需要排列节点,如果node节点没有依赖关系的话,全部会被排列到父节点里面,然后再次循环移除node的依赖父节点,加入到tmproot次节点之后,这样会建立一个统一的mSortedNodes的数组

  然后通过遍历mSortedNodes数组移除旧的监听器,

  设置nodesToStart来控制全部的节点,

  然后再次添加上对应的DependecyListener和AnimatorSetListerner

  如果判断延时少于0 ,就把节点的animator播放,并加到mPlayingSet里面,

  否则添加值ValueAnimator作为延迟空效果,并通过监听器来在遍历播放节点

  通过通过回调来调用每个节点监听器的onAnimationStart,

  如果判断节点内其全部的节点都被执行完,木有延迟,那么触发节点的onAnimationEnd的方法

  start的方法其实还需要涉及到DependecyListener

  这里可以看明白,器通过调用onANimationStart和onAnimationEnd判断运行rule的规则来判断是否启动动画

  通过判断父AnimatorSet是否被取消返回

  然后判断移除dependencies依赖关系

  当全部依赖关系满足的时候,就开启动画

  (2)使用pause的方法,会让所有延迟的方法暂停,然后调用每个节点里的pause方法

  然后循环调用节点里面的onAnimationPause的方法,暂停每个动画。

  pause的方法是停止在中间的状态。

  resume的方法也是类似的,用来恢复当前pause状态的动画运行

  (3)canel的方法中,需要判断是否正在播放

  如果正在播放会全部调用节点onAnimationCancel的方法,

  然后再遍历调用延时动画的cancel方法和节点动画的cancel方法。

  最后出发节点的onAnimationEnd的方法。

  触发剩余调用节点onAnimationCancel的方法,

  将全部动画监听器移除,将mPlayingSet的动画移除

  将剩下的动画onDone状态设置为false,

  触发节点的onAnimationEnd的回调方法

  cancel之后动画会停留在中间运行的状态

  (4)另外一种end的方法也是可以停止动画运行,

  可以看到会停止掉延迟,

  然后调用每个动画的end方法和onAnimationEnd的方法,

  最后设置回start的标志

  end和cancel的不同是,调用了end的方法,它会把动画直接发生整个动画的最后一帧然后停止。

  关于AnimatorSet的源码分析就到这里了。

  LED光源的种类有很多种,LED光源表示的是LED照明行业。LED是由发光二极管简称LED。是由Ga、As、P、N(镓、砷、磷、氮)等化合物做成的。LED光源是LED的基础上面分布出来的,它是发光的能源叫做LED光源。

  LED漫反射灯条

  LED光源的种类分布在LED照明行业,我们常见的LED光源有。LED家庭照明类、LED亮化照明类、LED广告照明类、LED工业照明类、LED交通照明类、LED设备照明类、LED电子照明类等等。这么多的种类都可以统称为LED光源。LED光源是一个大的名词,也包含着LED发光的能源。

  LED软灯带

  我们细化来讲LED广告照明类光源,其包含了LED灯箱光源、LED发光字光源、LED展示柜光源等三大类。LED家庭照明包含了家用使用照明和LED家用美化照明。LED亮化照明类其实就是我们在夜晚所看到的城市夜景。包含了大厦的LED洗墙灯,外景光源,LED埋地灯等亮化照明设备。LED工业光源为工业设备照明。LED交通光源包含了汽车照明、路灯、信号灯等照明。LED电子光源包含了LED背光灯。

  在平常人眼中,LED光源与LED灯具看似相同,但在专业人士眼中这两个概念却截然不同。从专业角度来说,LED光源与LED灯具有着非常明显的区别,本文就将针对这种区别来进行多方面的对比讲解,感兴趣的朋友快来看一看。

  LED光源与灯具的定义

  led灯珠与灯具的定义LED光源是以LED灯或LED模块提供的部件。LED灯具是设计为使用LED光源的灯具。

  灯具(luminaire)定义是“能分配、透出或转变一个或多个灯发出光线的一种器具,并包括支承、固定和保护灯必需的所有部件(但不包括灯本身),以及必需的电路辅助装置和将它们与电源连接的装置。LED误解为LED光源的原因传统灯具中的光源几乎都是可以替换的。随着LED的出现,使用LED模块的灯具多数以不可替换的形式出现,似乎呈现出一体化的趋势,LED光源与LED灯多少钱一个具的界限也似乎分不清楚了。

  整体是个发光器,可以被视为光源?实际在灯具定义中的“注”中写得明确:采用整体式不可替换光源的发光器被视作一个灯具,使用LED模块的灯具恰恰是一个灯具的例子。光源具有被不同的灯具使用的特点光源被灯具所使用。光源比喻为源水的话,灯具比喻为泉水。LED光源既可以在筒灯中用,又可以用在道路灯具。将“LED路灯”或者“LED隧道灯”理解为“光源”的话,就无法被其他灯具再次利用了,与“灯具”利用“光源”的概念相悖。外壳防护等级的差异作为光源,没有特殊的外壳防护等级的要求或应达到IP20。

  当然,光源的其他性能指标项目还包括显色指数、色品坐标、色温和寿命等等。对使用传统光源的灯具,灯具的光输出,即灯具转换光源光通量的能力,是灯具性能的经典指标项目。由于LED光源的性能参数尚未达到标准化的程度,而且很多灯具使用的LED光源不可替换,所以,光效的概念也被误用到了LED灯具产品。

  LED光源光效和LED灯具效能的概念LED光源光效(luminous efficacy of a source)定义是光源发出的光通量与其自身所消耗的电功率之比。单位为lm/W。是不包含电器附件的损失的。LED灯具效能(luminaire efficacy)定义是指在灯具的声称使用条件下,灯具发出的初始总光通量与其所消耗的功率之比,单位为lm/W。是包含电器附件的损失的。

  “光效”用于评价LED光源,“效能”用于评价LED灯具,LED光源光效与LED灯具效能都表示电能转化为光能的效率,是描述照明产品节能特性的指标项目,但其内涵是不同的。

  不同的光通量LED光源光效中的光源光通量是指裸光源(还未装入灯具时的状态)发出的光通量。其中LED光源可以是一体化LED灯或一体化LED模块、半一体化LED灯或半一体化LED模块或非一体化LED灯或非一体化LED模块。LED灯具效能表述式中的分子—-光通量是指光源装入灯具、同时使用所需的LED控制装置或LED控制装置的电源后灯具发出的光通量。

  其中LED控制装置或LED控制装置的电源可以是整体式、内装式或独立式的。使用LED光源的灯具可能使用反射器、扩散板或透镜。装入灯具的光源可能是单个光源或多个光源的集合,但由于热能、电能的相互作用造成的效率损失,以及灯具光学系统的效率,LED灯具的光通量并不等于LED光源光通量或其简单累加。LED光源光效中的光通量与灯具效能中的光通量的测量状态不同,前者是在脉冲状态测得,后者是在稳态的工作状态下测得。

  LED光源光效中的光是无所指向性的,只要光能发出来,各个方向的都认可。而LED灯具效能中的光是有所指向性的,光需要发到有用的区域。在使用相同LED光源的情况下,LED灯具的光通量小于LED光源的光通量。不同的输入功率LED光源光效表式中的分母与LED灯具效能中的分母含义也不相同。例如,对于非一体化LED模块,LED光源所消耗的电功率的仅是指LED模块所消耗的功率,不包括LED控制装置消耗的功率。

  LED灯具效能中的消耗的电功率是指灯具的输入功率,不仅包括LED光源,还包括LED控制装置所消耗的功率。LED灯具消耗的电功率大于LED光源消耗的电功率。LED灯具效能与LED光源光效的关系由于所涉及光通量和电功率的范围不同,造成LED光源光效不同于LED灯具效能,光源光效远大于灯具效能。其一是LED进入灯具后,结温升高,光输出减少(热损失);其二是光源进入灯具、并使用LED控制装置或其电源后存在的系统损耗;其三是光线经过灯具光学系统后的损失,即灯具效率(光损失)。

  灯具效能=光源光效×(1-进入灯具后光通量的热损失)×(1-电器附件系统的损失)×(1-进入灯具光学系统后的光损失)(%)从上面的分析可以看出,光源光效与灯具效能是完全不同的,不能混为一谈。可以看到,LED灯具与LED光源在光通量、输入功率、防护等级方面都有着较为明显的区别。由此可见灯具与光源在概念上的不同还是非常明显的。在正式接触LED相关知识之前,不如花上一段时间来阅读本文,搞清灯具与光源的区别。

猜你喜欢

转载自blog.csdn.net/weixin_42841716/article/details/81670674