Android 自定义ScrollView嵌套滚动兼容,监听滑动状态:顶部、底部、停止、滑动中

/**
 * 1、监听ScrollView滚动
 * 2、嵌套滚动兼容
 *
 * @author chrisZou
 * @from http://blog.csdn.net/fy993912_chris/article/details/72765260
 * @email chrisSpringSmell@gmail.com
 */
public class CustomCompatScrollView extends ScrollView {

    private GestureDetector mGestureDetector;

    private ScrollListener scrollListener;

    private boolean isScrolling = false;

    public CustomCompatScrollView(Context context) {
        this(context, null);
    }

    public CustomCompatScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomCompatScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mGestureDetector = new GestureDetector(context, new YScrollDetector());
        setFadingEdgeLength(0);
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldX, int oldY) {
        super.onScrollChanged(x, y, oldX, oldY);
        if (scrollListener != null) {
            isScrolling = true;
            scrollListener.onScrollChanged(this, x, y, oldX, oldY);
            if (getChildAt(0) != null && getChildAt(0).getMeasuredHeight() <= getScrollY() + getHeight()) {
                scrollListener.onScrollBottom(this);
            } else if (getScrollY() == 0) {
                scrollListener.onScrollTop(this);
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (MotionEvent.ACTION_UP == ev.getAction()) {
            if (isScrolling) {
                scrollListener.onScrollStop(this);
            }
            isScrolling = false;
        }
        return super.onTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
    }

    public void setScrollListener(ScrollListener scrollListener) {
        this.scrollListener = scrollListener;
    }

    class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return Math.abs(distanceY) > Math.abs(distanceX);
        }
    }

    public interface ScrollListener {
        void onScrollChanged(ScrollView scrollView, int x, int y, int oldx, int oldy);

        void onScrollBottom(ScrollView scrollView);

        void onScrollTop(ScrollView scrollView);

        void onScrollStop(ScrollView scrollView);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值