本文是在以下四篇基础上添加的弹性滚动和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 = 284position = 196position = 118position = 76position = 37position = 1.0position = -33position = -62position = -87position = -108position = -123position = -141position = -159position = -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



更多相关文章

  1. Android学习之 UI效果
  2. Android官方设计常用icon以及color颜色RGB值和对应颜色效果图
  3. 【Android 界面效果47】RecyclerView详解
  4. android抽屉效果
  5. android google地图定位开发,且可以自由移动位置重新获取定位,地址
  6. android UI进阶之弹窗的使用(2)--实现通讯录的弹窗效果
  7. Android实现振动效果
  8. android刮刮奖效果
  9. Android 图片倒影效果源码

随机推荐

  1. android判断当前应用是否启动、app运行状
  2. Android(安卓)Gesture Detector
  3. android强制完全退出核心代码
  4. android View绘制流程
  5. 强大的 Android(安卓)属性动画 ObjectAni
  6. 【Android】自定义Dialog如何设置点击事
  7. Ubuntu 12.04(64位)下载并编译 Android(安
  8. android 发短信、打电话、发邮件
  9. [Android]在代码里运行另一个程序的方法
  10. Android(安卓)实现Activity后台运行