2014年2月5日 星期三

Android of the MotionEvent Studying!

Android 事件當中有蠻多個input device event, 其中有一個MotionEvent,
位於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
 


沒有留言:

張貼留言