自定义View系列(八)

自定义View实战之

自定义实现监听滑动到底部的ScrollView

Android是默认没有提供监听ScrollView滑动到底部的API的,因此,如果我们需要监听ScrollView是否滑动到底部,我们需要自定义ScrollView。

先直接上代码:

public class ScrollBottomScrollView extends ScrollView {
    private OnScrollBottomListener onScrollBottomListener;
    private int calCount;

    public ScrollBottomScrollView(Context context) {
        super(context);
    }

    public ScrollBottomScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollBottomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public interface OnScrollBottomListener {
        void scrollToBottom();
    }

    public void setOnScrollBottomListener(OnScrollBottomListener onScrollBottomListener) {
        this.onScrollBottomListener = onScrollBottomListener;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        View view = this.getChildAt(0);
        if (this.getHeight() + this.getScrollY() == view.getHeight()) {
            calCount++;
            if (calCount == 1) {
                if (onScrollBottomListener != null) {
                    onScrollBottomListener.scrollToBottom();
                }
            }
        } else {
            calCount = 0;
        }
    }

    //另一种实现方式
    /*@Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
        if (scrollY != 0 && onScrollBottomListener != null) {
            onScrollBottomListener.scrollToBottom(clampedY);
        }
    }*/
}

然后在业务代码里,

                        scrollView.setOnScrollBottomListener(new ScrollBottomScrollView.OnScrollBottomListener() {
                            @Override
                            public void scrollToBottom() {
                                //业务逻辑处理
                            }
                        });

现在,我们结合代码进行分析:

其实我们的思路是这样的,既然系统没有提供这样一个监听器给我们,那么我们就自定义ScrollView,我们自己写一个监听器,这样不就完了吗。然后我们再将这个监听器对外暴露出去。

我们再来讲一下核心:到底是如何监听到ScrollView滑动到了底部呢?其实有两种办法(上面的代码中都提到了),

办法一:

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        View view = this.getChildAt(0);
        if (this.getHeight() + this.getScrollY() == view.getHeight()) {
            calCount++;
            if (calCount == 1) {
                if (onScrollBottomListener != null) {
                    onScrollBottomListener.scrollToBottom();
                }
            }
        } else {
            calCount = 0;
        }
    }

办法二:

@Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
        if (scrollY != 0 && onScrollBottomListener != null) {
            onScrollBottomListener.scrollToBottom(clampedY);
        }
    }

猜你喜欢

转载自blog.csdn.net/zdj_Develop/article/details/81362424
今日推荐