参考SlidingDrawer的Android animation 的算法

Animation的算法,通常都会有一个时间点,画到那个时间点为止,而不是用画1pixel*pixel去得到animation的总时间。

  比如说animation的velocity是2000px/s, 那么如果画出的高度是400px,所需的时间就是0.2secs

  在这0.2secs内要画完,同时SlidingDrawer有设定16ms/frame,所以SlidingDrawer会是每16ms画一次,每次画的时候看距离0.2s还有百分之多少就画多少,直到0.2s到了为止。

  如果CPU够快的话,它在0.2s内可以画200ms/16ms/frame = 12次,按代码来看,SlidingDrawer会发delay message(delay 16ms)给自己的ui thread,如果CPU Loading比较重,那么可能无法在16ms后开始画,所以会延时更久,比如只能画6次,然而在0.2s后就会画完,只是画的次数较少,这样的画,SlidingDrawer拉出来感觉就会不是那么的流畅。画的次数越多,越流畅。

  总之,Android的Animation会因为CPU Loading重而fps变低,但是Animation的总时间不会变。

  SlidingDrawer Velocity的算法如下:

  Java代码

  private void incrementAnimation() {

  long now = SystemClock.uptimeMillis();

  float t = (now - mAnimationLastTime) / 1000.0f; // ms -> s

  final float position = mAnimationPosition;

  final float v = mAnimatedVelocity; // px/s

  final float a = mAnimatedAcceleration; // px/s/s

  mAnimationPosition = position + (v * t) + (0.5f * a * t * t); // px

  mAnimatedVelocity = v + (a * t); // px/s

  mAnimationLastTime = now; // ms

  }

  private void incrementAnimation() {

  long now = SystemClock.uptimeMillis();

  float t = (now - mAnimationLastTime) / 1000.0f; // ms -> s

  final float position = mAnimationPosition;

  final float v = mAnimatedVelocity; // px/s

  final float a = mAnimatedAcceleration; // px/s/s

  mAnimationPosition = position + (v * t) + (0.5f * a * t * t); // px

  mAnimatedVelocity = v + (a * t); // px/s

  mAnimationLastTime = now; // ms

  }

  具体参考 /frameworks/base/core/java/android/widget/SlidingDrawer.java

转自:http://www.cnmsdn.com/html/201004/1270313910ID3114.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值