我試圖在系統覆蓋視圖上獲取多個觸摸事件,但我只收到MotionEvent.ACTION_OUTSIDE
事件。Android:Multi touch和TYPE_SYSTEM_OVERLAY
是否有任何可能的方式獲得系統覆蓋多個觸摸事件?
任何示例或鏈接都會非常有幫助。
我試圖在系統覆蓋視圖上獲取多個觸摸事件,但我只收到MotionEvent.ACTION_OUTSIDE
事件。Android:Multi touch和TYPE_SYSTEM_OVERLAY
是否有任何可能的方式獲得系統覆蓋多個觸摸事件?
任何示例或鏈接都會非常有幫助。
要創建疊加視圖,在設置LayoutParams
時,需要將類型設置爲TYPE_SYSTEM_OVERLAY
並使用標記FLAG_WATCH_OUTSIDE_TOUCH
。這就提出了一個問題,因爲作爲Android文檔指出:
您將不會收到完整的向下/移動/向上的姿態,只有第一個下來作爲
ACTION_OUTSIDE
的位置。
爲了得到你需要使用TYPE_SYSTEM_ALERT
類型的觸摸事件全陣列,而這會導致疊加佔據整個畫面,並停止與其他元素的互動。解決方案是使用TYPE_SYSTEM_OVERLAY
和TYPE_SYSTEM_ALERT
,並根據需要通過更改LayoutParams
的類型在它們之間切換。
ACTION_OUTSIDE
運動事件: 這是通過實現的。
LayoutParams
類型TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
有一兩件事要記住的是,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
< <我發現這一個是非常重要的。沒有它,重點是覆蓋和軟鍵(家庭,菜單等)按下不傳遞給下面的活動。
此外,上一個鏈接(上面)已更新以反映此更新。
於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及更高版本的設備上接收觸摸事件。
這很有幫助!那麼,您建議我在Android 4.0之前使用的是FLAG_WATCH_OUTSIDE_TOUCH而不是FLAG_WATCH_OUTSIDE_TOUCH。是否還有另一個應該實施的標誌? – Brian
感謝您的更新Jawsware。但使用你的邏輯,我也無法在疊加層上看到多個觸摸事件。我的意思是,如果你的第一根手指在屏幕上,然後第二根,然後第三根(沒有解除先前的),我們應該能夠接收觸摸事件(即onTouch()應該被調用)。反正有可能嗎? – Ravs
在'TYPE_SYSTEM_OVERLAY'狀態下,您將不會收到多點觸摸信息。一旦切換到「TYPE_SYSTEM_ALERT」(即按下疊加層後擡起手指),您應該會收到多點觸摸事件。 我附加了'\ nPOINTERS:「+ event.getPointerCount()'給我的示例中的每個'info.setText'調用,指針計數會增加\減少,因爲我觸摸了\提起我的手指 第一次我只收到移動事件,但指針數仍然改變 – jawsware
但是我想要的是實際上使用TYPE_SYSTEM_OVERLAY進行多點觸控,這是否可能呢? – Ravs