本文是在以下四篇基础上添加的弹性滚动和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实现书籍翻页效果--扩展版
  2. Android实现振动效果
  3. android刮刮奖效果
  4. Android学习之 UI效果
  5. Android(安卓)滚动条属性
  6. Listview
  7. 【Android(安卓)界面效果47】RecyclerView详解
  8. android抽屉效果
  9. android UI进阶之弹窗的使用(2)--实现通讯录的弹窗效果

随机推荐

  1. Android Handler机制分析
  2. Android消息队列(三)--多线程与消息处理
  3. android content providers相关
  4. 在android中用TimePicker和DatePicker或
  5. Android/ios/h5 三步调起QQ群聊,一键加群
  6. android构建自定义View和自定义组件
  7. Android 多进程学习
  8. Android TV apk移植到Android 9弹框概率
  9. android的国际化和本地化
  10. android selector 需要顺序的啊