重写RecyclerView实现下滑关闭功能

下拉关闭效果,大致如上图(网上随便找的)

 

序言:

如果你只是简单实现这种效果,Android原生就已经有一个很不错的控件:BottomSheetDialog ,相信你可以通过这个名字轻松搜索出它的用法,用法非常简单。

 

如果你有特殊需求,不能使用dialog,单靠一个RecycleView实现这种下拉关闭的效果,那你可以试试我这种方式。

 

思路:

我们首先要知道,这个RecyclerView滑动是不是已经在最顶部,其次判断出用户向下滑动的手势。两个条件同时满足时,就关闭(隐藏)该RecyclerView。

 

实现:

/**
 * 最顶部继续向下滑动时,会触发回调的RecyclerView
 * Created by Fushize on 2018/12/27.
 */

public class MyRecyclerView extends RecyclerView {

    private float mPosY;    //手指按下时Y轴的值
    private float mCurPosY; //手指移动时Y轴的值
    private boolean isTop = true;//判断是否到达顶部
    private boolean isStop = false; //第一次进入RecyclerView时默认就是顶部,所以需要进行判断
    private CloseView callBack;

    //滑动到顶部时如果继续下滑则回调此方法
    public interface CloseView {
        void colseCallBack();
    }


    public void setCloseViewListener(CloseView callBack){
        this.callBack = callBack;
    }


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

    public MyRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPosY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                mCurPosY = event.getY();
                break;
            case MotionEvent.ACTION_UP:
                if (mCurPosY - mPosY > 0 && (Math.abs(mCurPosY - mPosY) > 10)) {
                    //向下滑動
                    if (isTop) {
                        callBack.colseCallBack();
                    }
                }
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public void onScrolled(int dx, int dy) {
        super.onScrolled(dx, dy);
        if (isStop) {
            if (canScrollVertically(-1)) {
                isTop = false;
            } else {
                //滑动到顶部
                isTop = true;
            }
        }
        isStop = true;
    }
}

 

使用:

1.用MyRecyclerView在布局中替换原本的RecyclerView。

2.实现下拉会触发的回调方法:

        mRecyclerView.setCloseViewListener(new MyRecyclerView.CloseView() {
            @Override
            public void colseCallBack() {
               //下拉回调
            }
        });

3.你可以在这个回调里做你的事情,它就像OnClick。

4. 如果你需要隐藏显示RecyclerView,最好加个过渡动画,看起来会好看一点。

 

End.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值