WEB开发网
开发学院手机开发Android 开发 关于 Android animation 的算法(参考SlidingDrawe... 阅读

关于 Android animation 的算法(参考SlidingDrawer)

 2010-04-03 16:58:00 来源:WEB开发网   
核心提示:Animation的算法,通常都会有一个时间点,关于 Android animation 的算法(参考SlidingDrawer),画到那个时间点为止,而不是用画1pixel*pixel去得到animation的总时间,总之,Android的Animation会因为CPU Loading重而fps变低,比如说anima

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

}

具体参考 frameworksasecorejavaandroidwidgetSlidingDrawer.java

Tags:关于 Android animation

编辑录入:coldstar [复制链接] [打 印]
赞助商链接