您的位置:首页 > 移动开发 > Android开发

Android 实现ListView 3D效果 - 2 - 弹性滚动,Fling

2013-04-09 21:23 1091 查看
   本文是在以下四篇基础上添加的弹性滚动和fling效果

《Android 自己动手写ListView学习其原理 1 显示第一屏Item》

《Android 自己动手写ListView学习其原理 2 上下滚动》
《Android 自己动手写ListView学习其原理 3 ItemClick,ItemLongClick,View复用》

《Android 实现ListView 3D效果 - 1》

一、有图有真相



二、动态效果

    添加动态效果可以使列表看起来更人性化,如回滚摆动,Fling效果。如果只是自动滚动和Fling效果可以使用Android 提供的辅助类Scroller。回滚可以使用ListView 在Andorid 9版本以后支持的OverScroll达到预期效果,不过本实例的效果更酷。

首先定义一个动态效果工具类Dynamics

    主要包含两个变量position位置和velocity速率。Dynamics是一个抽象类可以很方便基于其实现不同的ListView动态滚动效果。

class SimpleDynamics extends Dynamics {
private float mFrictionFactor;

public SimpleDynamics(final float frictionFactor) {
mFrictionFactor = frictionFactor;
}

@Override
protected void onUpdate(final int dt) {
mPosition += mVelocity * dt / 1000;
mVelocity *= mFrictionFactor;
}
}


上面出现一个陌生的公式,这个公式涉及到“欧拉积分”:
mPosition += mVelocity * dt / 1000;

    通过欧拉积分由速度计算位置,其实这个公式精确度并不是很高,但是针对于手机上用为UI的移动控制精度已经足够了。
新位置 = 旧位置 + 速度 * 间隔时间
    其中除以1000是为了同比缩放。

针对“欧拉积分”在计算机领域的使用细节可以查看:
《Flash ActionScript 3.0  动画高级教程》 第六章 数值积分
如果不想查看此书,网上也有把这一章的内容贴出来的:
高级物理:数值积分(欧拉积分)
http://randomclan.blog.163.com/blog/static/145300982012121101715171/

以下是在ListView 3D边界向下拉动,然后送开手,ListView 3D随抬起手指向上滚动,之后在向下滚动。以下是position位置的截取其中一部分:
position = 284
position = 196
position = 118
position = 76
position = 37
position = 1.0
position = -33
position = -62
position = -87
position = -108
position = -123
position = -141
position = -159
position = -178


其变化规律是先由正值 - > 0 > 负值。

三、在不移动是触发以上效果
if (mDynamicsRunnable == null) {
mDynamicsRunnable = new Runnable() {
public void run() {
if (mDynamics == null) {
return;
}
mListTopStart = getChildTop(getChildAt(0)) - mListTopOffset;
mDynamics.update(AnimationUtils.currentAnimationTimeMillis());

scrollList((int)mDynamics.getPosition() - mListTopStart);

if (!mDynamics.isAtRest(VELOCITY_TOLERANCE, POSITION_TOLERANCE)) {
postDelayed(this, 16);
}

}
};
}


每16秒向消息队列中添加Runnable。

Flinging、滚动限制等直接看代码吧

四、源码下载

点击下载源码

参考资料:
Making your own 3D list – Part 3 (final part)

2013-04-16  添加于之前文章关联

转载请注明出处:http://blog.csdn.net/love_world_/article/details/8779683
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: