Android - ScrollView滑动到底部或者顶部的两种响应方式

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事件在手指松开已经接收到这时候却还没有到达底部。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断一个ScrollView滑动是否到底部,可以通过监听该ScrollView滑动事件进行判断。具体步骤如下: 1. 首先,获取ScrollView的滚动位置。可以通过scrollView的getScrollY()方法获取到当前ScrollView垂直方向滚动的距离。 2. 接下来,通过scrollView的getHeight()方法获取到ScrollView的高度。 3. 再使用scrollView.getChildAt(0).getHeight()方法获取到ScrollView中第一个子控件的高度。 4. 判断滑动的距离是否等于ScrollView中第一个子控件的高度减去ScrollView的高度,即getScrollY() == scrollView.getChildAt(0).getHeight() - scrollView.getHeight()。 上述判断的条件成立时,说明ScrollView已经滑动到了底部。可以通过监听ScrollView滑动事件,在滑动事件的监听回调中进行判断。如果条件成立,则说明已经滑动底部。 示例代码如下: scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { int scrollY = scrollView.getScrollY(); //垂直方向滑动的距离 int childHeight = scrollView.getChildAt(0).getHeight(); //ScrollView中第一个子控件的高度 int scrollViewHeight = scrollView.getHeight(); //ScrollView的高度 //判断是否滑动底部 if (scrollY == childHeight - scrollViewHeight) { //已经滑动底部,做相应操作 } } }); 通过监听ScrollView滑动事件并进行相应判断,即可判断ScrollView滑动是否到底部
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值