2013-07-19 4 views
1

저는 안드로이드 개발에 처음 왔으므로 저를 동반해야합니다.Android/Processing MotionEvent getX()가 예외를 발생시킵니다.

저는 두 번의 동시 누름과 함께 작동하는 처리 스크립트를 작성했습니다. 이렇게하려면 android.view.motion 이벤트를 사용하고 있습니다. 내 주인공 (pde)에서 나는 이것을 가지고있다 :

public boolean surfaceTouchEvent(MotionEvent event) { 
    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { 
    //do action down stuff... 
    } 
    //etc do other actions... 

이것은 잘 동작한다.

FATAL EXCEPTION: main 
java.lang.IllegalArgumentException: pointerIndex out of range 
    at android.view.MotionEvent.nativeGetAxisValue(Native Method) 
    at android.view.MotionEvent.getX(MotionEvent.java:1974) 
    at processing.test.scrapeashape.ScrapeAShape.surfaceTouchEvent(ScrapeAShape.java:131) 
    at processing.core.PApplet$SketchSurfaceView.onTouchEvent(Unknown Source) 
    at android.view.View.dispatchTouchEvent(View.java:5604) 
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2060) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1829) 
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2060) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1829) 
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2060) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1829) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1917) 
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1376) 
    at android.app.Activity.dispatchTouchEvent(Activity.java:2364) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1865) 
    at android.view.View.dispatchPointerEvent(View.java:5784) 
    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2894) 
    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2470) 
    at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845) 
    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2479) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4448) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
    at dalvik.system.NativeStart.main(Native Method) 

단지를 제외하고 전 출력은 다음과 같습니다 : 첫 번째 포인터가 두 번째 예외가 생성됩니다 전에 을 리프트 때

//ACTION_MOVE 
    else if (event.getActionMasked() == MotionEvent.ACTION_MOVE) { 
    int pointercount = event.getPointerCount(); 
    print("pointercount: " + str(pointercount)); 
    for (int i = 0; i<pointercount; i++) { 
     int pointerId = event.getPointerId(i); 
     print("i: " + str(i)); 
     print("pointerid: " + str(pointerId)); 
     movex[pointerid] = event.getX(pointerId); 
     movey[pointerid] = event.getY(pointerId); 
    } 
    } 

: 문제는 ACTION_MOVE 처리로 제공

pointercount: 1 
i: 0 
pointerid: 1 

그래서 포인터 ID가 1 인 포인터가 하나 있습니다. getX()가 예외를 발생시키고 있지만 왜 나는 이해하지 못합니다. g event.getPointerId()에 의해 주어진 포인터.

아이디어가 있으십니까?

답변

0

나는 그것을 알아 냈다.

getX()는 이벤트 목록에서 색인을 사용합니다. 포인터가 아닙니다. 나는 "getPointerId (int)를 사용하여이 색인의 포인터 식별자를 찾으십시오."라는 문서를 잘못 해석했습니다. getPointerId를 사용하여 getX()에 대한 매개 변수를 생성하지 마십시오. 아직 색인이 없으면 findPointerIndex()를 사용하십시오. 코드의 수정은 위의 것

...

movex[pointerid] = event.getX(i); 
    movey[pointerid] = event.getY(i); 

... 내 배열은 암시 적으로 포인터 ID로 색인되기 때문이다. 약간은 알아. 그 이후로 코드가 이동했습니다.

관련 문제