2013-03-01 3 views
0

NativeActivity 클래스 내에 GestureDetector을 사용하고 싶지만 작동하지 않는 것 같습니다. NativeActivity 앱에 GestureDetector을 사용할 수 있습니까? 내 코드는 다음과 같다 :NativeActivity 내의 GestureDetector

내 응용 프로그램을 실행
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() 이제까지 전화를받을. 여기에 명백한 내용이 누락되었거나 과 NativeActivity을 사용할 수 없습니까?

감사

편집 : 그것은 그들이 C 측에 전달되기 전에 자바 측 MotionEvents을 차단하는 것이 가능하지 않는 것, 나는 이제 다른 방법으로 라운드를 시도했습니다 : 나는 C 측의 AINPUT_EVENT_TYPE_MOTION을 얻을 때마다, 나는이 같은 JNI를 통해 자바 측의 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)); 

자바 방법 runGestureDetector() 단순히 D 그럼이 다음 :

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()은 나를 위해 가장 중요한 입니다.

내 의심스런는 (모든 MotionEvent 역사 매개 변수 역사적 ​​크기가 안드로이드/input.h 참조) MotionEvent에 저장 될 수있는 역사적 가치 에 의존 할 수 있기 때문에 onFling()가 작동하지 않는다는 것입니다. 그러나 MotionEvent 클래스의 obtain() 생성자는 을 사용하여 내역 값이있는 MotionEvent 객체를 구성 할 수 없습니다.

그래서 C면에서 얻은 실제 MotionEvent를 의 Java 측 onTouchEvent()에 공급할 수있는 방법이 있습니까? 나는, 자바 측에서 기록 정보 :-(

어떤 아이디어? 내가 하지 시험이 한

답변

0

와 MotionEvent를 구성하는 수 없습니다 AFAICS NDK API를 통해 역사적 가치를 얻을 수 있지만, 그리고 내가, 당신이 접선하지 않는 볼 수까지 NativeActivity에 익숙하지만 아니에요 당신의 GestureDetector
대신 OnTouchListener을 만드는, 무시하려고 당신의 활동의 onTouchEvent(MotionEvent event) :.

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

이것은 귀하의 GestureDetector에 귀하의 활동 권한에 대한 모든 MotionEvent를 전달합니다. 특정보기에만 MotionEvents를 잡을하려는 경우 당신은 당신의 OnTouchListener를 첨부 할 수 있습니다

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

이미이는 정상적인 활동에 적용 할 수 말했듯이, 나는 NativeActivities의 작동 방식 단서가 없다 ...

어쨌든, 이것이 도움이되기를 바랍니다.

+0

답장을 보내 주셔서 감사합니다.나는 이미 NativeActivity의 onTouchEvent()를 재정의하려고 시도했음을 언급 했어야합니다. Android 설명서에 NativeActivity가 Activity 클래스의 onTouchEvent() 메서드를 상속한다고 명시되어 있지만 결코 호출되지 않습니다. 불행히도, 이것은 갈 길이 없습니다 :/ – Andreas

+0

죄송합니다. 나는 또한 당신의 질문에 대해 논평했을뿐입니다. 그러나 나의 평판은 이것을 아직 허용하지 않습니다. 불행히도 나는 C/C++에 익숙하지 않지만 [onInputQueueCreated] (http://developer.android.com/reference/android/app/NativeActivity.html#onInputQueueCreated (android.view.InputQueue)))? – Griddo

+0

흠, onInputQueueCreated()가 어떻게 도움이 될 수 있다고 생각하십니까? 어떻게 든 모든 터치 이벤트를 가로 채서 GestureDetector로 전달할 수있는 방법을 찾아야합니다. 어떻게 onInputQueueCreated()가 여기에 도움이 될지 모르겠다. ... – Andreas

관련 문제