《PullScrollView详解(四)——完全使用listview实现下拉回弹(方法一).docx》由会员分享,可在线阅读,更多相关《PullScrollView详解(四)——完全使用listview实现下拉回弹(方法一).docx(19页珍藏版)》请在金锄头文库上搜索。
1、PullScrollView详解(四)完全使用listview实现下拉回弹(方法一)前言:今天看到一篇文章,非常喜欢其中的一句话,送给大家如果万事俱备,那还要你干嘛。相关文章:1、PullScrollView详解(一)自定义控件属性2、PullScrollView详解(二)Animation、Layout与下拉回弹3、PullScrollView详解(三)PullScrollView实现4、PullScrollView详解(四)完全使用listview实现下拉回弹(方法一)5、PullScrollView详解(五)完全使用listview实现下拉回弹(方法二)6、PullScrollView详
2、解(六)延伸拓展(listview中getScrollY()一直等于0、ScrollView中的overScrollBy)在前面三篇中,我为大家展示了使用ScrollView实现下拉回弹的效果。但如果ScrollView里如果嵌套使用ListView就可能会出现问题,因为两者都会有滑动监听。操作起来可能会起冲突,然后解决了冲突问题,到后面页面性能也会很差强人意。即然如此,那我们就直接使用listview来实现下拉回弹的效果就好了。在这篇中,我先给大家展示一种比较容易出效果的方法重写overScrollBy()函数。在下一篇中,我们将模仿PullScrollView中的实现方式自己对OnTouc
3、hEvent()进行监听、操作。注意注意!本篇文章讲述的OverScrollBy(),大家应该把最大注意力放在4、用途:捕捉当前listview是否到底或到顶部分,至于下拉回弹,大家看看就好,OverScrollBy()实现的下拉回弹,bug一堆,根本无法实际运用到实际项目中,大家看看就好,下篇将带着大家利用OnTouchEvent()实现下拉回弹的效果。一、setOverScrollMode()与OverScrollBy()1、OverScrollBy()OverScrollBy()是Android 9 之后才新增的API. 用于设定listview滚出屏幕后的回弹效果。先看OverScro
4、llBy()函数的定义:protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) 它的参数多的有点让人模糊,下面给大家说下各个参数的意思。这些意思目前大家看不懂也没关系,先大致了解下,后面讲例子时还会再讲。 deltaX:当前X轴滑动的像素数 deltaY:当前Y轴滑动的像素数 scrollX:在加
5、上deltaX值以前的X轴总的滑动量 scrollY:在加上deltaY值以前的Y轴总滑动量 scrollRangeX: scrollRangeY:这两个什么意思,我也没弄懂 maxOverScrollX:X轴最大的OverScroll范围(最大可超过边界的像素) maxOverscrollY:Y轴最大的OverScroll范围(最大可超过边界的像素) isTouchEvent:当前overScrollBy函数的调用是否由Touch事件引起的2、setOverScrollMode()上面OverScrollBy()是当listview超过顶部或者底部的时候,会被调用。那定义listView能不
6、能超过顶部或底部滑动,也就是说让不让OverScrollBy()调用,是通过setOverScrollMode()函数来定义的。public void setOverScrollMode(int mode)mode有三个取值:/一直允许超过顶部/底部下拉public static final int OVER_SCROLL_ALWAYS = 0;/只有Content足够大到能scroll的时候,才允许超过顶部/底部下拉(系统默认值)public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1;/不允许超过顶部/底部下拉public sta
7、tic final int OVER_SCROLL_NEVER = 2;当然,我们也可以不设置setOverScrollMode(int mode),系统默认的滚动属性为OVER_SCROLL_IF_CONTENT_SCROLLS;即只有listview的content足够大到可以滚动的情况下,才允许超过顶部/底部下拉这里大家应该对OverScrollBy()有个初步的认识了,下面我们先看看怎么实现下拉回弹,然后再讲解,为什么要这么做。二、简单示例先看下效果:注意,overScrollBy()实现的回弹效果是不能设置下拉方向的,即,不但顶部下拉会回弹,在底部下拉时也会回弹。但从效果图中也可以看
8、到,顶部下拉会回弹,底部下拉是不会回弹的,这是因为在最终代码中做了顶部还是底部判断,当在底部时,就不让用户上拉回弹了,至于怎么做到的,来一起看代码吧。下面我们就通过一个最简单的例子来看下OverScrollBy()的用法及效果。1、实现OverScrollView首先,新建一个类OverScrollView,重写ListView代码如下:class OverScrollList extends ListView /定义最大滚动高度 int mContentMaxMoveHeight = 300; public OverScrollList(Context context) super(cont
9、ext); public OverScrollList(Context context, AttributeSet attrs) super(context, attrs); public OverScrollList(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle); protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scr
10、ollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mContentMaxMoveHeight, isTouchEvent); 在这个类里面,只做了两件事:第一:定义一下变量mContentMaxMoveHeight,来表示可滑动到最大高度int mContentMaxMoveHeight = 3
11、00;第二:重写overScrollBy函数,把return语句中的maxOverScrollY替换成我们定义的mContentMaxMoveHeight; protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) return super.overScrollBy(deltaX, deltaY,
12、scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mContentMaxMoveHeight, isTouchEvent); 要实现可以overscroll的listview就需要做这么多,下面就是一如即往的往listview里填充数据的部分了。2、ListView填充数据在填充数据前,还是给大家看一下MainActivity的布局:(main.xml) 下面就是正式填充数据的环节了。先创建一个XML来做为Item的布局:(item_layout.xml)然后就是在MainActivity中的填充数据的部分了,代码如下 :public class MainActivity extends Activity private String mStrings = Abbaye de Belloc, Abbaye du Mont des Cats, Abertam, Abondance, Ackawi, Acorn, Adelost, Affidelice au