关于 Android animation 的算法(参考SlidingDrawer)
2010-04-03 16:58:00 来源:WEB开发网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
- ››Android 当修改一些代码时,使用什么编译命令可以最...
- ››Android 如何添加一个apk使模拟器和真机都编译进去...
- ››Android 修改Camera拍照的默认保存路径
- ››Android 如何修改默认输入法
- ››android开发中finish()和System.exit(0)的区别
- ››Android手势识别简单封装类
- ››android中查看项目数字证书的两种方法
- ››Android中获取IMEI码的办法
- ››android 相机报错 setParameters failed
- ››Android重启运用程序的代码
- ››Android为ListView的Item设置不同的布局
- ››android bitmap与base64字符串的互相转换
更多精彩
赞助商链接