在運行Android 2.2的設備上,我想要檢測用戶何時按下屏幕一段時間。想象一下,發送一個莫爾斯電碼消息,短小點(點)和長按(短劃線)。我想在用戶舉起手指時立即響應短按,並且在500毫秒後(例如)持續按下她的手指後再按一次。處理可取消超時的典型Java技術是什麼?
我已經看過FutureTask和ScheduledExecutorService,但這些看起來像這個實施過度殺毒。或者,也許我只是冷靜地處理線程,並查看處理它們所需的所有代碼。
這裏的簡化僞代碼因爲我怎麼做這樣的事情在其他語言:
public boolean onTouch(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
timer = createObjectToCallback(callbackMethod, 500); // milliseconds
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if (timer still exists) {
timer.kill();
// Do the short press thing
} else {
// Do nothing. It already happened when callbackMethod was triggered
}
}
}
public void callbackMethod() {
// Do the long press thing. The timer has already auto-destructed.
}
什麼簡單的方法是有在Java中這樣做的?響應答案
==編輯從@zapl ==
編寫代碼的工作原理是一回事。瞭解它如何工作是另一回事。
如果我理解正確,更新UI的線程已經在循環中運行。讓我們設想一個非常簡單的例子。
Main活動創建一個黑色畫布,幷包含一個onTouch
方法。當它開始時,它調用setOnTouchListener
。主線程現在不斷偵聽來自屏幕的輸入。如果用戶觸摸屏幕的方式已更改,則會調用onTouch
方法以及有關更改的信息。
假設onTouch
方法在觸摸點周圍繪製一個綠色圓圈。這個圓圈是使用屬於主線程的循環繪製的。繪圖完成後,主線程開始檢查屏幕上的新更改。如果沒有更改,則不會再調用onTouch
,並且綠點不會移動。
當用戶擡起手指時,屏幕將更改的信息提供給主線程,並且onTouch
方法中的代碼將擦除點。
Create interface
Has the screen detected a change? No: loop
Has the screen detected a change? No: loop
...
Has the screen detected a change? Yes: draw a green dot; loop
Has the screen detected a change? No: loop.
...
Has the screen detected a change? Yes: new position => redraw the green dot; loop
...
Has the screen detected a change? Yes: not touching => remove dot; loop
Has the screen detected a change? ...
假設我希望點在用戶的手指移動至少500毫秒時變成紅色。沒有任何舉動意味着不回撥到onTouch
。所以我可以設置一個Handler
,它將自己添加到主線程的循環中。主線程現在在其循環中有兩個動作。
Create interface
Has the screen detected a change? No: loop
Has the screen detected a change? No: loop
...
Has the screen detected a change? Yes: a touch; draw a green dot; add Handler; loop
Has the screen detected a change? No;
Is it time for Handler to trigger? No: loop.
...
Has the screen detected a change? No;
Is it time for Handler to trigger? Yes: change dot color to red; remove Handler; loop.
Has the screen detected a change? No: loop.
...
Has the screen detected a change? Yes: not touching => remove dot; loop
Has the screen detected a change? ...
任何由Handler
執行的代碼將阻塞主線程,直到它完成。
這是Handler
做什麼的準確描述?
看看有沒有這些幫助:http://stackoverflow.com/questions/3553163/android-long-touch-event,http://stackoverflow.com/questions/4324362/detect-touch-press-vs-長按vs運動,http://developer.android.com/training/gestures/detector.html – 2014-10-29 01:51:30
謝謝。我希望能夠觸摸獨立的東西,以便在其他情況下重複使用該技術。如果我理解正確,onLongPress會在用戶將其手指從屏幕上移開時觸發,這不是我想要的。我的情況有點複雜,因爲它也需要允許用戶移動她的手指,並且具有單獨的含義。 – 2014-10-29 02:00:17
看來,這就是我正在尋找的:http://stackoverflow.com/a/11679788/1927589 – 2014-10-29 02:06:53