`

ListView反弹效果实现

阅读更多

基于ScrollView反弹效果的一些原理(可以看我另外一篇帖子),看了下ListView滚动的一些代码.发现这两者实现方式有些不太一样.
ListView根本没有继承使用View的ScrollBy和ScrollTo,而且它的移动到最上和最下的判断也打不一样,代码如下,截取自AbstractListView的trackMotionScroll(int,int)方法:   
  final int end = getHeight() - listPadding.bottom;
        final int spaceBelow = lastBottom - end;
        final int height = getHeight() - mPaddingBottom - mPaddingTop;
        if (deltaY < 0) {
            deltaY = Math.max(-(height - 1), deltaY);
        } else {
            deltaY = Math.min(height - 1, deltaY);
        }
        if (incrementalDeltaY < 0) {
            incrementalDeltaY = Math.max(-(height - 1), incrementalDeltaY);
        } else {
            incrementalDeltaY = Math.min(height - 1, incrementalDeltaY);
        }
        final int firstPosition = mFirstPosition;
        if (firstPosition == 0 && firstTop >= listPadding.top && deltaY >= 0) {
            // Don't need to move views down if the top of the first position
            // is already visible
            return true;
        }
        if (firstPosition + childCount == mItemCount && lastBottom <= end && deltaY <= 0) {
            // Don't need to move views up if the bottom of the last position
            // is already visible
            return true;
        }
这个mFirstPosition是显示的第一个ListView的Item,firstPosition + childCount == mItemCount这句话的意思是可以显示最后的childCount条(这是个规律,自己可以算算),在加上lastBottom(也就是最后一个显 示item)比end(也就是ListView的最底部距离最上部的距离)小,一般情况下都是比它大,如图: ,firstTop >= listPadding.top 和这个相反,也就是第一个item比paddingTop要大,如果ListView不设这个属性的话那就是0了.这里要说下不管是end、 firstTop或者是lastBottom意思都是距离它的最上面的组件或者是parent的距离,不是屏幕.详细的大家可以去看 trackMotionScroll.
  我的实现是在基本不破坏原有功能的基础上加入了一些可以继续移动的代码,也就是使用View的scrollBy.
  此为抛砖引玉,反弹效果刷新实现有点生硬,大家可以优化它,让它更流畅。
  这种效果也应该有人写过,这是我自己的实现。提供附件下载,转载请注明出处。

分享到:
评论

相关推荐

    android中实现listview的反弹效果

    android中实现listview的反弹效果

    listview反弹

    android listview反弹效果(动态调整listview页脚页眉) 和上拉刷新效果通过隐藏或显示 headview 和footerview 来实现反弹,刷新!

    listview反弹效果

    清晰的讲述了反弹的原理,代码很好的实现了该效果

    反弹ListView

    自定义的ListView,实现拉到顶部或者底部时的反弹缓冲效果,

    完美仿小米设置界面

    完美仿小米设置圆角ListView,实现了自定义圆角ListView,自定义Item点击背景,自定义ScrollView实现边界反弹,解决与ListView显示冲突,去除边界蓝色渐变和边缘模糊效果。

    Android开发资料合集--续

    1、横向反弹效果 106 2、整个屏幕横向滚动 108 69、内存泄露分析 111 1、内存检测 111 2、内存分析 112 70、避免内存泄露 113 71、屏蔽Home键 118 72、onTouch 和 onClick 事件 118 73、监听某个数据表 119 74、IP...

    《程序天下:JavaScript实例自学手册》光盘源码

    3.44 textarea内实现行的翻页效果 3.45 textarea中的文本插入 3.46 查找两段文本中相同的词句 3.47 自动保存网页输出的文本 3.48 文本编辑器 第4章 鼠标特效 4.1 禁用鼠标右键 4.2 使鼠标滚轮失效 4.3 状态栏显示...

    程序天下:JavaScript实例自学手册

    3.44 textarea内实现行的翻页效果 3.45 textarea中的文本插入 3.46 查找两段文本中相同的词句 3.47 自动保存网页输出的文本 3.48 文本编辑器 第4章 鼠标特效 4.1 禁用鼠标右键 4.2 使鼠标滚轮失效 4.3 状态栏显示...

    vc++ 应用源码包_1

    自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大...

    vc++ 应用源码包_2

    自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大...

    vc++ 应用源码包_6

    自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大...

    vc++ 应用源码包_5

    自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大...

    vc++ 应用源码包_3

    自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大...

    vc++ 开发实例源码包

    自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大...

Global site tag (gtag.js) - Google Analytics