本文是在以下四篇基础上添加的弹性滚动和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中使用Animation实现控件的动画效果以及Interpolator和An
  5. android 图片叠加效果
  6. android底部中间凸出导航 BottomProtruding
  7. android百度地图 覆盖物弹出层效果
  8. android 自定义progressbar 样式
  9. Android实现振动效果

随机推荐

  1. 二阶段之八
  2. Android之Handler
  3. Android(安卓)ApiDemos示例解析(34):App->
  4. android内存管理
  5. 创建ListView的基本步骤
  6. Android百度地图(五):百度地图鹰眼sdk监
  7. 用angularjs写android应用连手机调试的步
  8. 【Android手机游戏】贪吃蛇(1)
  9. 安卓中的shape
  10. Android Studio 学习之 Android SDK快速