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



   本文是在以下四篇基础上添加的弹性滚动和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




你可能感兴趣的:(Android,UI)