Android RecyclerView左滑菜单编辑删除[2]并解决与SlidingPaneLayout手势冲突

Android RecyclerView左滑菜单编辑删除[2]并解决与SlidingPaneLayout手势冲突

  • 前言
  • 说明文章
  • 源码
  • 解决与SlidingPaneLayout手势冲突
  • 完事

前言

关于列表左滑菜单的事,我都纠结过好多次了,我的第一篇左滑菜单的文章在这:
android RecyclerView 左滑菜单/删除、编辑
但是用下来总感觉交互不够顺滑,后来发现官方的DrawerLayout控件可以做这个效果,又改称了DrawerLayout,文章在这:
Android 简单使用DrawerLayout来做列表左滑菜单-Kotlin
但是这个也是比较难触发,使用体验不好。

最近找呀找,终于看到有个改得比较好的RecyclerView,分享记录一下

说明文章

@有梦想的猿L ---- Android RecyclerView —— 实现侧滑菜单

源码

@jm17/SlideRecyclerView

解决与SlidingPaneLayout手势冲突

首先重写一个SlidingPaneLayout,重点就是要个侧滑开关

/**
 * 侧滑菜单布局
 *
 * @author D10NG
 * @date on 2019-05-04 14:36
 */
public class PageEnabledSlidingPaneLayout extends SlidingPaneLayout {
    /** x坐标 */
    private float mInitialMotionX;
    /** y坐标 */
    private float mInitialMotionY;
    /** 最小触发事件的划动距离 */
    private float mEdgeSlop;
    /** 是否允许侧滑 */
    private boolean isEnableSlip = true;

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

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

    public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        //--------  ViewConfiguration 滑动参数设置类 --------//
        ViewConfiguration config = ViewConfiguration.get(context);
        //--------  它获得的是触发移动事件的最短距离,如果小于这个距离就不触发移动控件  --------//
        mEdgeSlop = config.getScaledEdgeSlop();
    }

    public boolean getEnableSlip() {
        return isEnableSlip;
    }

    public void setEnableSlip(boolean enable) {
        isEnableSlip = enable;
    }

    /**
     * 拦截手势事件
     * @param ev
     * @return
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (MotionEventCompat.getActionMasked(ev)) {
            case MotionEvent.ACTION_DOWN: {
                // 屏幕检测到第一个触点按下
                mInitialMotionX = ev.getX();
                mInitialMotionY = ev.getY();
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                // 触点在屏幕上移动
                if (!isEnableSlip) {
                    return false;
                }
                final float x = ev.getX();
                final float y = ev.getY();
                // The user should always be able to "close" the pane, so we only check
                // for child scrollability if the pane is currently closed.
                if (mInitialMotionX > mEdgeSlop && !isOpen() && canScroll(this, true,
                        Math.round(x - mInitialMotionX), Math.round(x), Math.round(y))) {

                    // How do we set super.mIsUnableToDrag = true?

                    // send the parent a cancel event
                    MotionEvent cancelEvent = MotionEvent.obtain(ev);
                    cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
                    return super.onInterceptTouchEvent(cancelEvent);
                }
            }
        }
        return super.onInterceptTouchEvent(ev);
    }
}

接着在手势冲突的页面,拦截触摸事件,如果列表菜单打开了,就禁止SlidingPaneLayout侧滑。

    /**
     * 拦截点击事件
     * # 拦截滑动,当列表有展开menu时,先关闭menu
     */
    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        binding.spLayout.enableSlip = !binding.rcvDevice.isOpenMenu
        return super.dispatchTouchEvent(ev)
    }

完事

你可能感兴趣的:(Android知识线)