2015-07-21 29 views
5

我有一個應用程序,在室外,在所有條件下使用。這些都是根植B &運行Android 2.1的N Nook平板電腦。它們具有光學觸摸檢測功能,而不是壓力,因此屏幕上的大雨滴可以「禁用」設備,因爲它被檢測爲印刷機,然後檢測不到所有其他印刷機。如何檢測創建活動時已存在的屏幕觸摸?

第一部分:在正在使用的活動中,我手動檢測長時間(10秒)的屏幕按壓,與雨滴開始阻擋按壓一致。我爲此使用dispatchTouchEvent(),這很好。第二部分:然後我打開一個新的活動,實際上圈了雨滴,並告訴用戶「擦乾雨滴」。新的活動打開正常,我可以在任何地方成功繪製圓圈。

麻煩的是,新的活動沒有收到任何觸摸事件,這是非常第一次按...還沒有停止的長按。沒有得到「新」ACTION_DOWN是可以理解的......我已經抓住了這一點。如果我舉起手指,也沒有ACTION_UP。 經過解除初始按壓後,每一個工作都很好:我可以點擊屏幕,立即在該點周圍繪製一圈,如果我拖動手指,它會移動,因此在那裏沒有問題。

我該如何獲得初始新聞,那個把我帶到這裏的人還在嗎?它必須是某種輪詢API,而不是事件,因爲我真的想要當前的狀態,並且我知道事件已經被吸收了。要清楚的是,直到我第一次將手指從屏幕上移開(即使關閉不會創建可檢測的事件),任何事件都不會從dispatchTouchEvent()中出來。

(我可能搶先前的活動的座標,並通過它...但有雨的下降可能會在10秒的等待期間滑動的麻煩而且我寧願活動是自我包含做它的工作。)

回答

2

我不確定你可以(雖然我從來沒有嘗試過)。我很確定觸摸事件一旦打開新活動就會被取消。

您可以決定的方法是使用Framgents API或直接在被觸摸的視圖之上打開新的視圖。

是正在接收觸摸事件將繼續這樣做,直到這些事件的發生一個觀:

  1. onTouchEvent()返回false的方法。如果在任何時候返回false,它將一起停止接收觸摸事件。意思是,如果您在ACTION_MOVE動作中返回false,您將會收到而不是接收ACTION_UP操作。

  2. 您會收到一個ACTION_CANCEL,表示手勢已結束。通常這意味着觸摸離開了視圖邊界,但這可能是多種原因。

  3. 您會收到ACTION_UP,這意味着從視圖中擡起的最後一個觸摸手指。

意見在後面總會只要接收觸摸事件,在大多數做默認的行動前回復false意見。因此,如果您只是在視圖頂部彈出一個新的視圖來記錄觸摸,只需保持記錄並將繪製座標傳遞給頂部視圖即可。

+0

隨着我進一步瞭解,我意識到缺少ACTION_UP是有問題的。這是我的通知,這個下降已經被消滅了。在前面的觀點中並沒有發生。我想知道是否有一個狀態問題,操作系統在沒有首先發送ACTION_DOWN的情況下不會發送ACTION_UP。或者也許在我打開這個活動之前,我需要清除某種輸入/事件隊列。我能以某種方式在第一個活動中發送ACTION_CANCEL嗎? – Anders8

+0

完整手勢以ACTION_DOWN開始並以ACTION_UP或ACTION_CANCEL結束(所有其他操作均爲可選)。除非得到一個ACTION_DOWN,否則你不會得到觸摸事件,並返回'true',表明你的View想要處理這個事件。 – DeeV

+0

當您轉換到另一個活動時,根視圖會更改,因此您觸摸的舊「視圖」消失了。如果發生這種情況,你*可能*得到一個ACTION_CANCEL,但我認爲系統更有可能切斷觸摸事件鏈並停止發送動作。發生這種情況時,您將不會在新的Activity中獲得觸摸事件,因爲您需要再次使用ACTION_DOWN來啓動鏈(這就是爲什麼當您擡起手指並將其放回時它會再次開始工作的原因)。 – DeeV