`
nanapoleon
  • 浏览: 46670 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

谈谈动画架构?

阅读更多
    为什么用问号?因为有点不知道写什么了。。。这周真的很忙,没有太多的时间来学习,就吃吃老本吧。
    首先,先谈谈android自己的动画机制。
    我们知道,继承Animation需要实现一个方法,applyTransformation (interpolatedTime, Transformation t)。我们可以通过时间t来确定对我们的view做什么操作!这个是基本功,我不想多做解释了。
    那系统是如何绘制出动画的呢?为什么我们使用了anim.start()我们就可以得到想要的动画呢?
    我大概讲一下系统是怎么做的:
    一、代码位置,2D的绘画机制是ViewGroup包含几个View,组成树状结构。在Viewgroup的代码中,你可以找到动画绘制的代码,在Viewgroup里的dispatchDraw方法中。
    二,实现,在ViewGroup dispatchDraw中,child.getAnim.isStart()? 如果是,那么,记住startTime,然后新建Transformation传入这个child的Animation中(就是传入Animation的applyTransformation中),得到Animation的“目的”(平移?缩小?旋转?),好了,得到“目的”后,对dispatchDraw的Canvas作相应变化(比如平移,那么就使用canvas.translate),最后,在draw上我们的child!(其实ViewGroup在没有动画时候,就只作draw child这件事而已)。
    三、interpolatedTime怎么做出来的?animation都有自己的duration,在有了上面一步的startTime后,我们每次执行dispatchDraw的时候,可以获得当前时间nowTime(都是毫秒级别),那么我们使用(nowTime - startTime) / duration就可以得到这个float形式的百分比时间了percent。但是要得到interpolatedTime还需要将这个percentTime传入一个interpolator中,然后经过interpolator计算得出。(这就是加速或者减速变换的原理,当然还可以有更复杂的数学变换)
    四、有什么用?知道了android的动画架构,我们就可以知道:1.为啥我的view在做animation的时候会有一部分不现实呢,好像被截掉了?根据上面分析,你这个做动画的view所依附的ViewGroup是不是太小了?这个时候,增加ViewGroup的padding是一个好办法。2.我们还可以自己根据这个架构,做动画。比如在onDraw中,自己算interpolatedTime,是否还需要动画?是,invalidate(),继续。
    其实,动画就是每次刷新把图像画出来就行,也就两个重点,如何画?怎么刷新?
    android怎么刷新?就是在dispatch中,如果需要动画,那么在每次绘画后,会继续call一次invalidate方法。android如何画?就是使用interpolatedTime和Transformation的机制来画出动画。
    接下来,我来介绍一种android中自己做的动画方法。举个例子,平移。首先,如何画?使用Scroller类,来辅助计算,设定最终的x y值,start后,就可以在任一时间问它要现在到哪了(x和y值)!需要做动画的View,需要放出接口,来供控制者在得到xy值后可以改变View的属性。怎么刷新?自己做一个Runnable(一般嵌在View中可以直接使用post方法),留出接口,供动画开启(如scrollTo(x,y))。动画开启后,在run()中加入如何画的部分,知道怎么画后,改变View别且调用invalidate(),如果动画未结束,再次post自己,到达到持续动画的效果。如果结束,则remove自己,结束循环。
    好了,动画做出了,当然还有很多方法,只要解决上述两个问题即可。如3D中每次绘制结束后使用swapBuffer来解决怎么刷新。如何画这个问题,不同动画,方法不同罢了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics