位於Android SDK 中的 android.view.MotionEvent,
在底下範例將會Capture以下事件:
滑鼠按下、滑鼠彈起、滑鼠移動、觸碰按下、觸碰彈起、手指滑動、滾輪滑動。
基本上用到底下這兩個事件就很足夠:
- onTouchEvent()
- onGenericMotionEvent()
兩個都包在MotionEvent裡面, 但兩個差別在於, 一個事件是針對使用者的觸碰功能, 另外一個則是針對大多數的裝置(e.g. mouse, joystick..), 所以針對你的應用看適合那一個,
不過要特別注意的是優先序的問題, 其實兩個都有共同的觸發事件,
例如你點螢幕一下, 跟滑鼠點左鍵一下, 其實都會進入到兩個事件, 所以在處理上來講要注意。
底下列出 分別 capture TouchEvent and MouseEvent (請自行建立一個TextView來測試):
onTouchEvent:
@Override public boolean onTouchEvent(MotionEvent event) { int index = event.getActionIndex(); int action = event.getActionMasked(); int pointerId = event.getPointerId(index); switch(action) { case MotionEvent.ACTION_DOWN: mTestMouseEventTextView.setText("CLICK_DOWN"); break; case MotionEvent.ACTION_MOVE: mTestMouseEventTextView.setText("CLICK_DOWN_MOVE"); break; case MotionEvent.ACTION_UP: mTestMouseEventTextView.setText("CLICK_UP"); break; case MotionEvent.ACTION_CANCEL: mTestMouseEventTextView.setText("CANCEL"); break; default: return super.onTouchEvent(event); } return true; }
MouseEvent:
@Override public boolean onGenericMotionEvent(MotionEvent event) { if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { switch (event.getAction()) { case MotionEvent.ACTION_HOVER_MOVE: mTestMouseEventTextView.setText(String.valueOf(event.getX()) + "\n" + String.valueOf(event.getY())); return true; case MotionEvent.ACTION_SCROLL: mTestMouseEventTextView.setText("SCROLL"); return true; } } return super.onGenericMotionEvent(event); }
在上述中,以滑鼠事件來說, 如果你只是純粹移動, 並沒有點擊, 則會進入"HOVER_MOVE"事件,
因此我在裡面加了一行觀看目前的 x and y position。
其實還有其他更多的應用,都在官方MotionEvent原始檔裡面,註解寫的非常清楚,可以研究看看。
另外也可以自行模擬出滑鼠與鍵盤事件(i.e. 軟體自動執行某個按鍵或者是滑鼠移至指定座標), 使用Instrumentation()類別,
但是悲劇的是,Instrumentation類別裡面的IWindowManager在 Java 1.6中已拿掉,
網路上雖然有蠻多解決方法,但是我試了蠻多還是不成功,不過只要能夠將IWindowManager.aidl這個類別給找回來放置自己的Project中應該就可以了,改天再來試下。
- Reference:
Handling single and multi touch on Android- Tutorial
Android Touch and Multi-touch Event Handling
Android自動化測試初探(四) : 類比鍵盤滑鼠事件(Socket+Instrumentation實現)
android自动化测试中实现长按并拖动
[转]Android开发中隐藏类的使用
[Android 開發] 如何在 View 中監聽滑鼠滾動事件?
Mouse move on two views, how to let both of them handle the `ACTION_MOVE` event
Tracking Movement
沒有留言:
張貼留言