1. 程式人生 > >【Android】子控制元件搶佔父控制元件點選事件問題

【Android】子控制元件搶佔父控制元件點選事件問題

有一個全屏的Activity,根佈局是RecyclerView,每個item佔一個螢幕,item內包含一個預覽圖片。

需求是,在這個介面手指下滑,直接退出這個Activity。

誤區:

一開始我在這個Activity的根佈局設定了點選事件,在TouchEvent中的ACTION_DOWN和ACTION_UP中來判斷手指滑動位置是否需要退出Activity。但是執行之後,點選事件的有效區域只有:除了圖片外的黑色背景。而點選圖片時,圖片消費掉了這個點選事件,導致我的根佈局無法獲取點選事件。

解決方案:

不用根佈局的onTouchEventListener,改用addOnItemTouchListener。

addOnItemTouchListener可以在點選item的時候攔截掉這個點選事件。

onRequestDisallowInterceptTouchEvent,在子view請求父view不攔截事件的時候,可以做進一步邏輯判斷。

當僅點選而不是滑動的時候,父View先獲取到點選事件,然後子View後獲取點選事件。

當點了並且滑動的時候,父View獲取點選事件並滑動,子View並沒有獲取到點選事件。

如下方案:
        preview_rv.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent event) { // 判斷攔截的時機
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        lastDownX = event.getRawX();
                        lastDownY = event.getRawY();
                        break;
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_CANCEL:
                        float offsetX = event.getRawX() - lastDownX;
                        float offsetY = event.getRawY() - lastDownY;
                        if (offsetY > CLOSE_PREVIEW_OFFSET && offsetY > Math.abs(offsetX)) {
                            exitActivityWithAnim();
                            return true;
                        }
                        break;
                    default:
                        break;
                }
                return false;
            }

            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {

            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

            }
        });