【Android】子控制元件搶佔父控制元件點選事件問題
阿新 • • 發佈:2019-01-27
有一個全屏的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) { } });