Android RecyclerView左スライドメニュー編集削除[2]SlidingPaneLayoutジェスチャーとの競合解決

12594 ワード

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)
        }
    

    仕事を終える