2013-03-01 82 views
0

我想在我的NativeActivity類中使用GestureDetector,但它似乎不起作用。是否可以在NativeActivity應用程序中使用GestureDetector?我的代碼是這樣的:NativeActivity內部的手勢檢測器

public class HollywoodActivity extends android.app.NativeActivity { 

    private GestureDetector mGestureDetector; 
    private View.OnTouchListener mGestureListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 

      mGestureDetector = new GestureDetector(new MyGestureDetector()); 
      mGestureListener = new View.OnTouchListener() { 

       public boolean onTouch(View v, MotionEvent event) { 
        Log.i("DEBUG", "*** TOUCH VIEW ***"); 
        return mGestureDetector.onTouchEvent(event); 
       } 
      };         
    } 

    private class MyGestureDetector extends SimpleOnGestureListener { 

      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 

       Log.i("DEBUG", "FLING" + velocityX + " " + velocityY); 
       return true; 
      } 

      @Override 
      public boolean onDown(MotionEvent e) { 
       Log.i("DEBUG", "ON DOWN"); 
       return true; 
      }   
    } 
} 

當我運行我的應用程序,無論是onTouch(),也不onFling()也不onDown()曾經被調用。我在這裏丟失了一些明顯的東西,還是不可能使用GestureDetectorNativeActivity

感謝

編輯: 因爲它似乎並不可能 它們傳遞到C端之前攔截在Java端MotionEvents,現在我已經嘗試了另一種方式圓:每當我 得到C面的AINPUT_EVENT_TYPE_MOTION,我通過JNI餵養這在Java端的GestureDetector 這樣的:

(*env)->CallVoidMethod(env, g_android->activity->clazz, (*env)->GetMethodID(env, globalMyNativeActivityClass, "runGestureDetector", "(JJIIFFFFIFFII)V"), AMotionEvent_getDownTime(event), AMotionEvent_getEventTime(event), AMotionEvent_getAction(event), AMotionEvent_getPointerCount(event), AMotionEvent_getRawX(event, 0), AMotionEvent_getRawY(event, 0), AMotionEvent_getPressure(event, 0), AMotionEvent_getSize(event, 0), AMotionEvent_getMetaState(event), AMotionEvent_getXPrecision(event), AMotionEvent_getYPrecision(event), AInputEvent_getDeviceId(event), AMotionEvent_getEdgeFlags(event)); 

Java方法runGestureDetector()簡單地d Oes this then:

public void runGestureDetector(long downTime, long eventTime, int action, int pointerCount, float x, float y, float pressure, float size, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags) { 

    mGestureDetector.onTouchEvent(MotionEvent.obtain(downTime, eventTime, action, pointerCount, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags));    
} 

通過這樣做,我能夠檢測到一些手勢。 onDown(),onSingleTap()和onScroll() 進來就好了。然而,什麼是不工作的onFling()。但是onFling()對我來說是最重要的一個。

我suspection是onFling()不起作用,因爲它可能會依賴於可以存儲在一個MotionEvent歷史值 (每MotionEvent與歷史 參數的歷史尺寸,見的Android/input.h)。但是,MotionEvent類的gets()構造函數確實不允許我構造具有歷史值的MotionEvent對象,它不允許我使用 。

那麼有什麼辦法可以將我在C端獲得的真實MotionEvent提供給Java端的 上的onTouchEvent()嗎?我可以通過NDK API獲得歷史價值,但AFAICS是不可能 構建MotionEvent與Java方面的歷史信息:-(

任何想法?

回答

0

我沒有測試這一點,我不熟悉NativeActivity但據我所看到的,你不鉤住你的GestureDetector
創建OnTouchListener相反的,嘗試去駕馭你的活動的onTouchEvent(MotionEvent event)

@Override 
public boolean onTouchEvent (MotionEvent event) { 
    Log.i("DEBUG", "*** TOUCH VIEW ***"); 
    return mGestureDetector.onTouchEvent(event); 
} 

這會將您Activity上的每個MotionEvent傳遞給您的GestureDetector。如果你想捉對特定視圖僅MotionEvents您可以將OnTouchListener重視它:

findViewById(R.id.yourView).setOnTouchListener(mGestureListener); 

就像我已經說過了,這可能僅適用於正常活動,我不知道如何NativeActivities工作...

無論如何,我希望這有助於。

+0

感謝您的回覆。我應該提到我已經嘗試覆蓋NativeActivity的onTouchEvent()。儘管Android文檔說NativeActivity從Activity類繼承了onTouchEvent()方法,但它永遠不會被調用。所以不幸的是,這是不行的:/ – Andreas 2013-03-01 20:51:16

+0

對此我很抱歉。我也只會評論你的問題,但我的聲譽還不允許。不幸的是,我不熟悉C/C++,但是你看看[onInputQueueCreated](http://developer.android.com/reference/android/app/NativeActivity.html#onInputQueueCreated(android.view.InputQueue ))? – Griddo 2013-03-01 21:10:19

+0

嗯,你認爲可以在onInputQueueCreated()幫助這裏?我不知何故需要找到一種方法來攔截所有的觸摸事件,將它們轉發給GestureDetector。我沒有看到onInputQueueCreated()如何在這裏幫助... – Andreas 2013-03-01 21:20:16