1.判断是否已经滚动到顶部还是底部,代码如下:
private void doOnBorderListener() {
if (contentView != null && contentView.getMeasuredHeight() <= getScrollY() + getHeight()) {
if (onBorderListener != null) {
onBorderListener.onBottom();
}
} else if (getScrollY() == 0) {
if (onBorderListener != null) {
onBorderListener.onTop();
}
}
}
//滚动到顶部判断:getScrollY() == 0
//滚动到底部判断:View contentView = getChildAt(0);
//contentView.getMeasuredHeight() <= getScrollY() + getHeight();
//其中getChildAt表示得到ScrollView的child View,因为ScrollView只允许一个child view,
//所以contentView.getMeasuredHeight()表示得到子View的高度, getScrollY()表示得到y轴的滚动距离,getHeight()为scrollView的高度。
//当getScrollY()达到最大时加上scrollView的高度就的就等于它内容的高度了啊~
2.定义到达顶部或者底部响应事件接口:OnBorderListener,包含onTop和onBottom函数,代码如下:
/**
* 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();
}
3.(1)第一种方式:在OnTouchListener的onTouch中判断,主要代码如下:
this.onBorderTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
doOnBorderListener();
break;
}
return false;
}
};
//表示在touch结束后,手指拿起时执行doOnBorderListener,进行判断和响应。
3.(2)第二种方式:在onScrollChanged函数中判断,主要代码如下:
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
doOnBorderListener();
}
//在ScrollView的onScrollChanged函数中判断是否到达顶部和底部,并进行相应事件调用,
//onScrollChanged函数在ScrollView中内容开始滚动时出发被调用。
4.两种方式的比较:
第一种方式精确度高,但doOnBorderListener可能执行多次,因为ScrollView滑动中,onScrollChanged总是在不停被调用,需要用户自己做并发控制,
也可以参考DropDownListView的写法让用户在自定义Listener执行结束后手动调用onBottomComplete函数。
第二种方式不会造成doOnBorderListener多次执行,但却可能一次都没有调用。
比如你快速滑动,还未到达底部手指已经松开,由于惯性滚动到底部,可能并不会执行doOnBorderListener。
因为onTouch的ACTION_UP事件在手指松开已经接收到这时候却还没有到达底部。