2011-11-10 39 views
9

我試圖在系統覆蓋視圖上獲取多個觸摸事件,但我只收到MotionEvent.ACTION_OUTSIDE事件。Android:Multi touch和TYPE_SYSTEM_OVERLAY

是否有任何可能的方式獲得系統覆蓋多個觸摸事件?

任何示例或鏈接都會非常有幫助。

回答

24

要創建疊加視圖,在設置LayoutParams時,需要將類型設置爲TYPE_SYSTEM_OVERLAY並使用標記FLAG_WATCH_OUTSIDE_TOUCH。這就提出了一個問題,因爲作爲Android文檔指出:

您將不會收到完整的向下/移動/向上的姿態,只有第一個下來作爲ACTION_OUTSIDE的位置。

爲了得到你需要使用TYPE_SYSTEM_ALERT類型的觸摸事件全陣列,而這會導致疊加佔據整個畫面,並停止與其他元素的互動。解決方案是使用TYPE_SYSTEM_OVERLAYTYPE_SYSTEM_ALERT,並根據需要通過更改LayoutParams的類型在它們之間切換。

  1. 手錶的ACTION_OUTSIDE運動事件:

    這是通過實現的。

  2. 發生時,測試它是否出現在疊加層中。
  3. 如果那樣,開關LayoutParams類型TYPE_SYSTEM_ALERT
  4. 一旦與覆蓋的交互完成,切換回TYPE_SYSTEM_OVERLAY
  5. 重複

有一兩件事要記住的是,ACTION_OUTSIDE運動事件總是傳遞給屏幕上其餘的元素。因此,例如,如果疊加層位於按鈕的頂部,該按鈕也會收到運動事件,並且無法停止。

另外請確保您將SYSTEM_ALERT_WINDOW權限添加到mainifest文件。

我已經張貼在這裏的完整解決方案:
http://www.jawsware.mobi/code_OverlayView/(修訂版)

它包括所有的源代碼和下載整個示例項目的鏈接。


更新爲Android 4.0 - 2013年1月3日


創建疊加圖,建立的LayoutParams 時不要將類型設置爲TYPE_SYSTEM_OVERLAY

改爲將其設置爲TYPE_PHONE

使用下列標誌:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

FLAG_NOT_TOUCH_MODAL < <我發現這一個是非常重要的。沒有它,重點是覆蓋和軟鍵(家庭,菜單等)按下不傳遞給下面的活動。

此外,上一個鏈接(上面)已更新以反映此更新。

+1

感謝您的更新Jawsware。但使用你的邏輯,我也無法在疊加層上看到多個觸摸事件。我的意思是,如果你的第一根手指在屏幕上,然後第二根,然後第三根(沒有解除先前的),我們應該能夠接收觸摸事件(即onTouch()應該被調用)。反正有可能嗎? – Ravs

+0

在'TYPE_SYSTEM_OVERLAY'狀態下,您將不會收到多點觸摸信息。一旦切換到「TYPE_SYSTEM_ALERT」(即按下疊加層後擡起手指),您應該會收到多點觸摸事件。 我附加了'\ nPOINTERS:「+ event.getPointerCount()'給我的示例中的每個'info.setText'調用,指針計數會增加\減少,因爲我觸摸了\提起我的手指 第一次我只收到移動事件,但指針數仍然改變 – jawsware

+1

但是我想要的是實際上使用TYPE_SYSTEM_OVERLAY進行多點觸控,這是否可能呢? – Ravs

9

於Android 4.x版開始,Android團隊Android團隊通過添加一個新功能adjustWindowParamsLw(),其中 將增加FLAG_NOT_FOCUSABLE,FLAG_NOT_TOUCHABLE和刪除FLAG_WATCH_OUTSIDE_TOUCH標誌爲TYPE_SYSTEM_OVERLAY窗口固定一個潛在的 安全問題。

這是TYPE_SYSTEM_OVERLAY窗口不會在ICS平臺上收到任何觸摸事件。

更新:2016/5/4 TYPE_TOAST在Android 4.0〜4.3上無法接收觸摸事件。它與TYPE_SYSTEM_OVERLAY相同。在Android 4.4及更高版本中,從排除列表中刪除TYPE_TOAST,以便您可以使用TYPE_TOAST在Android 4.4及更高版本的設備上接收觸摸事件。

+1

這很有幫助!那麼,您建議我在Android 4.0之前使用的是FLAG_WATCH_OUTSIDE_TOUCH而不是FLAG_WATCH_OUTSIDE_TOUCH。是否還有另一個應該實施的標誌? – Brian