簡體   English   中英

如何查找MotionEvent ACTION_CANCEL的源視圖

[英]How to find the source view of a MotionEvent ACTION_CANCEL

如何找到導致MotionEvent ACTION_CANCEL的視圖? 我有一個接收ACTION_CANCEL的視圖“A”,我不希望這種情況發生。 在某處,視圖“B”正在“消耗”MotionEvent。 我希望有辦法找出誰是“B”,這樣我才能解決這個錯誤的問題。

我已經嘗試查看我的代碼中的各種OnTouchEvent()和OnInterceptTouchEvent()處理程序,但還沒有找到罪魁禍首。

我還在有問題的ACTION_CANCEL上設置了一個斷點但是我無法識別可能代表“B”的MotionEvent中的任何內容。

如果父母正在攔截運動事件,防止這種情況的唯一方法是阻止父母攔截該事件。 這可以通過兩種方式很好地管理。

如果沒有看到具體的代碼並想要一個通用的解決方案,我建議如下。

我建議通過管理家長和孩子來管理你的觸摸事件
requestDisallowInterceptTouchEvent(boolean)

受影響的視圖A,B中的每個視圖/視圖組的onInterceptTouchEvent(android.view.MotionEvent)事件處理程序。

通過禁止孩子中的父級攔截,這有助於您捕捉未考慮的父級攔截,並且還可以在一個父級內定制和更改子元素。

這必須從您的view / viewGroup的最高父級進行管理,並通過所有父級和子級關系進行管理。

檢查列表視圖,具有內置觸摸事件的任何元素。

android.com/training/gestures/viewgroup

在找到攔截事件的違規視圖方面,除了以下邏輯之外無法回答:

遍歷每個父級到子級/父級到子級視圖。 有條不紊地檢查每個視圖/視圖組中的ontouch處理,如圖中所示。

查看圖表

這些答案中有更多細節:
https://stackoverflow.com/a/30966413/3956566
https://stackoverflow.com/a/6384443/3956566

我相信你明白這一點,但對我來說,這是最簡單的解決方案。

除此之外,我們還需要查看您的代碼以對其進行故障排除。

如果我的問題正確,您可能在父級中接收ACTION_CANCEL ,您需要找到該視圖。 給定事件X和Y,您可以在ACTION_CANCEL發生的第一時間找到包含這些坐標的視圖。 嘗試使用頂級父級(android.R.id.content)或您正在處理的ViewGroup調用此方法。

private View findViewAt(View contentView, int eventX, int eventY) {
            ArrayList<View> unvisited = new ArrayList<View>();
            unvisited.add(contentView);
            while (!unvisited.isEmpty()) {
                View child = unvisited.remove(0);
                if(isViewContains(child, eventX, eventY) {
                    Log.i(TAG, "view found! ");
                    unvisited.clear();
                    return child;
                }
                if (!(child instanceof ViewGroup)){
                    continue;
                }
                ViewGroup group = (ViewGroup) child;
                final int childCount = group.getChildCount();
                for (int i=0; i< childCount; i++){
                    unvisited.add(group.getChildAt(i));
                }
            }
      return null;
    }


private boolean isViewContains(View view, int eventX, int eventY) {
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    int x = location[0];
    int y = location[1];
    int width = view.getWidth();
    int height = view.getHeight();
    return eventX < x || eventX > x + width || eventY < y || eventY > y + height;
}

根據我的經驗,一個使A視圖收到ACTION_CANCEL事件的案例是在用戶觸摸A之后他們將手指拖出A區域,如果你遇到這種情況,添加一個方法來檢查dispatchTouchEvent()上的位置可以救命。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM