关于判断scrollview的滑动到顶部和底部的问题
2014-09-18 17:38
417 查看
首先重写一下scrollview的onScrollchange方法,由于此方法是保护的,故定义接口回调
资源见此 (完整工程顺带了一个跑马灯) 点击打开链接
以下为转载 打开链接
关于使用可见:滚动到底部或顶部响应的ScrollView使用
示例APK可从这些地址下载:Google Play, 360手机助手,
百度手机助手, 小米应用商店, 豌豆荚
两种实现方式的主要不同点在于判断滑动位置的地方,第一种方式在onScrollChanged函数中判断, 第二种在OnTouchListener的onTouch中判断。其他如是否滚动到边缘的判断、响应事件接口OnBorderListener、对外暴露的接口都一样。
第一种方式代码可见onScrollChanged BorderScrollView
第二种方式代码可见OnTouchListener BorderScrollView
1、判断是否已经滚动到顶部或底部,代码如下:
Java
滚动到顶部判断:getScrollY() == 0
滚动到底部判断
其中getChildAt表示得到ScrollView的child View,因为ScrollView只允许一个child view,所以contentView.getMeasuredHeight()表示得到子View的高度, getScrollY()表示得到y轴的滚动距离,getHeight()为scrollView的高度。当getScrollY()达到最大时加上scrollView的高度就的就等于它内容的高度了啊~
2、定义到达顶部和底部响应事件接口OnBorderListener,包含onTop和onBottom函数
Java
这个接口允许用户自定义到达底部和顶部的响应事件 第一种方式: 在onScrollChanged函数中判断,主要代码如下:Java
在ScrollView的onScrollChanged函数中判断是否到达顶部和底部,并进行相应事件调用,onScrollChanged函数在ScrollView中内容开始滚动时出发被调用。
第二种方式: 在OnTouchListener的onTouch中判断,主要代码如下:
Java
表示在touch结束后,手指拿起时执行doOnBorderListener,进行判断和响应。
两种方式的比较:
第一种方式精确度高,但doOnBorderListener可能执行多次,因为ScrollView滑动中,onScrollChanged总是在不停被调用,需要用户自己做并发控制,也可以参考DropDownListView的写法让用户在自定义Listener执行结束后手动调用onBottomComplete函数。
第二种方式不会造成doOnBorderListener多次执行,但却可能一次都没有调用。比如你快速滑动,还未到达底部手指已经松开,由于惯性滚动到底部,可能并不会执行doOnBorderListener。因为onTouch的ACTION_UP事件在手指松开已经接收到这时候却还没有到达底部。
两种方式各有优劣,大家可酌情选择。我要求准确响应,所以选择了第一种,自己再做下控制确保不会多次执行。
public class MyScrollview extends ScrollView { private ScrollBottomListener listener; public MyScrollview(Context context) { super(context); // TODO Auto-generated constructor stub } public MyScrollview(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public MyScrollview(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { // TODO Auto-generated method stub super.onScrollChanged(l, t, oldl, oldt); System.out.println("-------------l:"+l+"--t:"+t+"--oldl:"+"--oldt:"+oldt); if (t+getHeight()>=computeVerticalScrollRange()) { listener.onBottom(); } if (t==0) { listener.onTop(); } } public void setOnScrollBottom(ScrollBottomListener listener) { this.listener = listener; } public interface ScrollBottomListener { public void onBottom(); public void onTop(); } }
资源见此 (完整工程顺带了一个跑马灯) 点击打开链接
以下为转载 打开链接
关于使用可见:滚动到底部或顶部响应的ScrollView使用
示例APK可从这些地址下载:Google Play, 360手机助手,
百度手机助手, 小米应用商店, 豌豆荚
两种实现方式的主要不同点在于判断滑动位置的地方,第一种方式在onScrollChanged函数中判断, 第二种在OnTouchListener的onTouch中判断。其他如是否滚动到边缘的判断、响应事件接口OnBorderListener、对外暴露的接口都一样。
第一种方式代码可见onScrollChanged BorderScrollView
第二种方式代码可见OnTouchListener BorderScrollView
1、判断是否已经滚动到顶部或底部,代码如下:
Java
1234567891011 | private void doOnBorderListener() { if (contentView != null && contentView.getMeasuredHeight() <= getScrollY() + getHeight()) { if (onBorderListener != null) { onBorderListener.onBottom(); } } else if (getScrollY() == 0) { if (onBorderListener != null) { onBorderListener.onTop(); } }} |
滚动到底部判断
1 2 | ViewcontentView=getChildAt(0); contentView.getMeasuredHeight()<=getScrollY()+getHeight(); |
2、定义到达顶部和底部响应事件接口OnBorderListener,包含onTop和onBottom函数
Java
1234567891011121314151617 | /** * OnBorderListener, Called when scroll to top or bottom * * @author Trinea 2013-5-22 */public static interface OnBorderListener { /** * Called when scroll to bottom */ public void onBottom(); /** * Called when scroll to top */ public void onTop();} |
1 2 3 4 5 | @Override protectedvoidonScrollChanged(intx,inty,intoldx,intoldy){ super.onScrollChanged(x,y,oldx,oldy); doOnBorderListener(); } |
第二种方式: 在OnTouchListener的onTouch中判断,主要代码如下:
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 | this.onBorderTouchListener=newOnTouchListener(){ @Override publicbooleanonTouch(Viewv,MotionEventevent){ switch(event.getAction()){ caseMotionEvent.ACTION_UP: doOnBorderListener(); break; } returnfalse; } }; |
两种方式的比较:
第一种方式精确度高,但doOnBorderListener可能执行多次,因为ScrollView滑动中,onScrollChanged总是在不停被调用,需要用户自己做并发控制,也可以参考DropDownListView的写法让用户在自定义Listener执行结束后手动调用onBottomComplete函数。
第二种方式不会造成doOnBorderListener多次执行,但却可能一次都没有调用。比如你快速滑动,还未到达底部手指已经松开,由于惯性滚动到底部,可能并不会执行doOnBorderListener。因为onTouch的ACTION_UP事件在手指松开已经接收到这时候却还没有到达底部。
两种方式各有优劣,大家可酌情选择。我要求准确响应,所以选择了第一种,自己再做下控制确保不会多次执行。
相关文章推荐
- ScrollView判断滑动到底部和顶部
- 关于ListView,GridView,ScrollView是否滑动到了顶部或者底部处理
- 判断ScrollView是否滑动到底部或顶部
- ScrollView判断是否滑动到底部和顶部
- ScrollView 判断滑动到底部
- 判断ScrollView是否滚动到顶部或底部
- 解决ScrollView底部有布局,不能滑动的问题
- android 关于 ScrollView嵌套GridView,ListView 显示和滑动的问题
- 关于scrollview 镶嵌linearlayout布局的控件位于底部的问题 关于scrollview镶嵌RelativeLayout布局失效
- 怎么判断android中ScrollView滑动到了最底部?
- 关于scrollview中嵌套横向滑动控件时产生的体验不佳问题
- android 关于 ScrollView嵌套GridView,ListView 显示和滑动的问题
- 监听scroollview、listview、gridview页面滑动,判断是否滑动到顶部以及底部
- IOS 判断scrollView是否滑动到底部
- 关于ScrollView中嵌套listview焦点滑动问题 解决
- Android-ScrollView(基本实现,顶部判断,底部判断,底部加载更多)
- 滑动到底部或顶部响应的ScrollView实现
- 判断ScrollView 是否滚动到底部或顶部
- android ScrollView判断滑动到底部的两种方式
- android listview或者ScrollView 去除顶部下拉时的蓝底或者上下滑动顶部和底部的虚化