关于判断scrollview的滑动到顶部和底部的问题

首先重写一下scrollview的onScrollchange方法,由于此方法是保护的,故定义接口回调

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、判断是否已经滚动到顶部或底部,代码如下:

滚动到顶部判断:getScrollY() == 0
滚动到底部判断

其中getChildAt表示得到ScrollView的child View,因为ScrollView只允许一个child view,所以contentView.getMeasuredHeight()表示得到子View的高度, getScrollY()表示得到y轴的滚动距离,getHeight()为scrollView的高度。当getScrollY()达到最大时加上scrollView的高度就的就等于它内容的高度了啊~

 

2、定义到达顶部和底部响应事件接口OnBorderListener,包含onTop和onBottom函数

这个接口允许用户自定义到达底部和顶部的响应事件

 

第一种方式: 在onScrollChanged函数中判断,主要代码如下:

在ScrollView的onScrollChanged函数中判断是否到达顶部和底部,并进行相应事件调用,onScrollChanged函数在ScrollView中内容开始滚动时出发被调用。

 

 

第二种方式: 在OnTouchListener的onTouch中判断,主要代码如下:

表示在touch结束后,手指拿起时执行doOnBorderListener,进行判断和响应。

 

两种方式的比较:
第一种方式精确度高,但doOnBorderListener可能执行多次
,因为ScrollView滑动中,onScrollChanged总是在不停被调用,需要用户自己做并发控制,也可以参考DropDownListView的写法让用户在自定义Listener执行结束后手动调用onBottomComplete函数。

 

第二种方式不会造成doOnBorderListener多次执行,但却可能一次都没有调用。比如你快速滑动,还未到达底部手指已经松开,由于惯性滚动到底部,可能并不会执行doOnBorderListener。因为onTouch的ACTION_UP事件在手指松开已经接收到这时候却还没有到达底部。

两种方式各有优劣,大家可酌情选择。我要求准确响应,所以选择了第一种,自己再做下控制确保不会多次执行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值