最近在Android上做了一些动画效果,网上查了一些资料,有各种各样的使用方式,于是乘热打铁,想具体分析一下动画是如何实现的,Animation, Animator都有哪些区别等等。

首先说Animationandroid.view.animation.Animation)对象。

无论是用纯java代码构建Animation对象,还是通过xml文件定义Animation,其实最终的结果都是

Animation a = new AlphaAnimation();Animation b = new ScaleAnimation();Animation c = new RotateAnimation();Animation d = new TranslateAnimation();

分别是透明度,缩放,旋转,位移四种动画效果。

而我们使用的时候,一般是用这样的形式:

View.startAnimation(a);

那么就来看看View中的startAnimation()方法。

 

1.View.startAnimation(Animation)

先是调用View.setAnimation(Animation)方法给自己设置一个Animation对象,这个对象是View类中的一个名为mCurrentAnimation的成员变量。

然后它调用invalidate()来重绘自己。

我想,既然setAnimation()了,那么它要用的时候,肯定要getAnimation(),找到这个方法在哪里调用就好了。于是通过搜索,在View.draw(Canvas, ViewGroup, long)方法中发现了它的调用,代码片段如下:

 

2.View.draw(Canvas, ViewGroup, long)

其中调用了View.drawAnimation()方法。

 

3.View.drawAnimation(ViewGroup, long, Animation, boolean)

代码片段如下:

其中调用了Animation.getTransformation()方法。

 

4.Animation.getTransformation(long, Transformation, float)

该方法直接调用了两个参数Animation.getTransformation()方法。

 

5.Animation.getTransformation(long, Transformation)

该方法先将参数currentTime处理成一个float表示当前动画进度,比如说,一个2000ms的动画,已经执行了1000ms了,那么进度就是0.5或者说50%。

然后将进度值传入插值器(Interpolator)得到新的进度值,前者是均匀的,随着时间是一个直线的线性关系,而通过插值器计算后得到的是一个曲线的关系。

然后将新的进度值和Transformation对象传入applyTranformation()方法中。

 

6.Animation.applyTransformation(float, Transformation)

Animation的applyTransformation()方法是空实现,具体实现它的是Animation的四个子类,而该方法正是真正的处理动画变化的过程。分别看下四个子类的applyTransformation()的实现。

ScaleAnimation

AlphaAnimation

RotateAnimation

TranslateAnimation

 

可见applyTransformation()方法就是动画具体的实现,系统会以一个比较高的频率来调用这个方法,一般情况下60FPS,是一个非常流畅的画面了,也就是16ms,为了验证这一点,我在applyTransformation方法中加入计算时间间隔并打印的代码进行验证,代码如下:

最终得到的log如下图所示:

右侧是“手动”计算出来的时间差,有一定的波动,但大致上是16-17ms的样子,左侧是日志打印的时间,时间非常规则的相差20ms。

 

于是,根据以上的结果,可以得出以下内容:

1.首先证明了一点,Animation.applyTransformation()方法,是动画具体的调用方法,我们可以覆写这个方法,快速的制作自己的动画。

2.另一点,为什么是16ms左右调用这个方法呢?是谁来控制这个频率的?

 

对于以上的疑问,我有两个猜测:

1.系统自己以postDelayed(this, 16)的形式调用的这个方法。具体的写法,请参考《使用线程实现视图平滑滚动》

2.系统一个死循环疯狂的调用,运行一系列方法走到这个位置的间隔刚好是16ms左右,如果主线程卡了,这个间隔就变长了。

更多相关文章

  1. Android官方使低版本系统(2.1)支持ActionBar的方法
  2. Android4.0.3 修改 启动 动画
  3. Androi与html中的JavaScript之间方法相互调用
  4. Android动画原理分析
  5. Android Activity切换动画效果的修改
  6. 【Android】Android中Button的OnClickListener实现方法
  7. Android webview中定制js的alert,confirm和prompt对话框的方法 (
  8. Android 性能优化的一些方法(转)
  9. Android ListView Animation 4种动画效果(贴上了GIF图)

随机推荐

  1. View事件体系(Android开发艺术探索读书笔
  2. android 简单的相册查看器
  3. Activity面试详解
  4. Android调试之LOG和LOGCAT详解
  5. Android中SharePreferences的简单实现
  6. 安卓定时刷新界面
  7. Android开发指南(31) —— Multimedia an
  8. Android自定义View实现HTML图文环绕效果
  9. GitHub上几种Android表格控件
  10. Android(安卓)WebView 详细介绍