江铃顺达冷藏车价格:参考SlidingDrawer的Android animation 的算法

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 13:10:58

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