F
FreedomTears
Neues Mitglied
- 0
Hey,
ich hab folgendes Problem beim interpretieren der Toucheingaben die vom System weiter gegeben werden.
Also wenn ich das richtig verstanden habe, dann gibt es Indizes und IDs (Pointer). Die Pointer identifizieren den tatsächlichen 'Finger' wobei die Indizies
nur die Stelle in der gespeicherten Datenstruktur angeben.
Ich hab jetzt ein spezielles Problem an dieser Stelle meines Programms:
Jedes mal wenn ich mehr 3 Finger auf dem Bildschirm habe und diese gleichzeitig wieder anhebe, schmiert die App ab und ich bekomme folgenden Fehler: IllegalArgumentException: pointerIndex out of range. Dieser tritt an hier auf:
Ich gehe davon aus, dass bei getX eben ein Index aufgerufen wird der nicht existiert. Problem ist, ich hab sowohl überprüft ob der Index kleiner der maximalen Anzahl an Pointern im Event ist (nicht im momentanen Code enthalten), als auch versucht, nur 2 Finger zu interpretieren. Das mit den zwei Fingern hat insofern auch geklappt, dass er nur 2 Finger verarbeitet, allerdings bekomm ich den selben Fehler immernoch.
Größtes Problem ist allerdings, dass dieser Index mir ja von einer API Methode bereit gestellt wird, dieser also eigentlich stimmen sollte. Kann mir jemand helfen? Im Folgenden übrigens die komplette Methode und die Fehlermeldung:
Mein Code:
Die Fehlermeldung:
ich hab folgendes Problem beim interpretieren der Toucheingaben die vom System weiter gegeben werden.
Also wenn ich das richtig verstanden habe, dann gibt es Indizes und IDs (Pointer). Die Pointer identifizieren den tatsächlichen 'Finger' wobei die Indizies
nur die Stelle in der gespeicherten Datenstruktur angeben.
Ich hab jetzt ein spezielles Problem an dieser Stelle meines Programms:
Code:
int eventPointer = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int eventPointerIndex = event.findPointerIndex(eventPointer);
coord = new ScreenCoord(event.getX(eventPointerIndex), event.getY(eventPointerIndex));
Code:
coord = new ScreenCoord(event.getX(eventPointerIndex), event.getY(eventPointerIndex));
Größtes Problem ist allerdings, dass dieser Index mir ja von einer API Methode bereit gestellt wird, dieser also eigentlich stimmen sollte. Kann mir jemand helfen? Im Folgenden übrigens die komplette Methode und die Fehlermeldung:
Mein Code:
Code:
public void processTouchEvent(MotionEvent event) {
Coord coord = new ScreenCoord(event.getX(), event.getY());
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
int singlePointer = event.getPointerId(0);
switch (action) {
case MotionEvent.ACTION_DOWN:
onTouchDown(touchPaths[singlePointer], coord, event);
break;
case MotionEvent.ACTION_UP:
onTouchUp(touchPaths[singlePointer], coord, event);
break;
case MotionEvent.ACTION_MOVE:
for (int i = 0; i < event.getPointerCount(); i++) {
coord = new ScreenCoord(event.getX(i), event.getY(i));
onTouchMove(touchPaths[event.getPointerId(i)], coord, event);
}
fireTouchMove(touchPaths[singlePointer], event.getPointerCount());
break;
}
// additional pointer events
if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) {
int eventPointer = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int eventPointerIndex = event.findPointerIndex(eventPointer);
coord = new ScreenCoord(event.getX(eventPointerIndex), event.getY(eventPointerIndex));
Log.d("GraphDroid", "ANOTHER FINGER");
switch (actionCode) {
case MotionEvent.ACTION_POINTER_DOWN:
onTouchDown(touchPaths[eventPointer], coord, event);
break;
case MotionEvent.ACTION_POINTER_UP:
onTouchUp(touchPaths[eventPointer], coord, event);
break;
}
}
// check gestures
boolean isSinglePointer = (event.getPointerCount() == 1);
boolean isMultiPointer = (event.getPointerCount() > 1);
if (isSinglePointer) {
checkDrag(touchPaths[singlePointer], event);
} else if (isMultiPointer) {
fireMultiTouchGesture(event.getPointerCount());
checkMultiDrag(event);
checkMapTranslation(event);
checkRotation(event);
checkZoom(event);
}
}
Die Fehlermeldung:
Code:
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): FATAL EXCEPTION: main
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): java.lang.IllegalArgumentException: pointerIndex out of range
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.MotionEvent.nativeGetAxisValue(Native Method)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.MotionEvent.getX(MotionEvent.java:1549)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at de.kit.graphdroid.touch.TouchInterpreter.processTouchEvent(TouchInterpreter.java:93)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at de.kit.graphdroid.draw.Whiteboard.onTouchEvent(Whiteboard.java:54)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.View.dispatchTouchEvent(View.java:4616)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1709)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1264)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.app.Activity.dispatchTouchEvent(Activity.java:2315)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1682)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.View.dispatchPointerEvent(View.java:4684)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2398)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.view.ViewRoot.handleMessage(ViewRoot.java:2060)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.os.Handler.dispatchMessage(Handler.java:99)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.os.Looper.loop(Looper.java:132)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at android.app.ActivityThread.main(ActivityThread.java:4123)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at java.lang.reflect.Method.invokeNative(Native Method)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at java.lang.reflect.Method.invoke(Method.java:491)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
10-31 15:31:51.735: ERROR/AndroidRuntime(32289): at dalvik.system.NativeStart.main(Native Method)
[LEFT][/LEFT]
Zuletzt bearbeitet: