OSDN Git Service

[fixed] this shit http://groups.google.com/group/android-developers/browse_thread...
authorbadlogicgames <badlogicgames@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Mon, 16 May 2011 21:02:20 +0000 (21:02 +0000)
committerbadlogicgames <badlogicgames@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Mon, 16 May 2011 21:02:20 +0000 (21:02 +0000)
WARNING it's tested but i have to go through ALL my devices to greenlight this.

backends/gdx-backend-android/src/com/badlogic/gdx/backends/android/AndroidInput.java
backends/gdx-backend-android/src/com/badlogic/gdx/backends/android/AndroidMultiTouchHandler.java

index c9d3369..1c4c236 100644 (file)
@@ -84,9 +84,10 @@ public final class AndroidInput implements Input, OnKeyListener, OnTouchListener
 \r
        ArrayList<KeyEvent> keyEvents = new ArrayList<KeyEvent>();\r
        ArrayList<TouchEvent> touchEvents = new ArrayList<TouchEvent>();\r
-       int[] touchX = new int[40];\r
-       int[] touchY = new int[40];\r
-       boolean[] touched = new boolean[40];\r
+       int[] touchX = new int[20];\r
+       int[] touchY = new int[20];\r
+       boolean[] touched = new boolean[20];\r
+       int[] realId = new int[20];\r
        final boolean hasMultitouch;\r
        private HashSet<Integer> keys = new HashSet<Integer>();\r
        private SensorManager manager;\r
@@ -120,6 +121,7 @@ public final class AndroidInput implements Input, OnKeyListener, OnTouchListener
                view.requestFocusFromTouch();\r
                this.config = config;\r
                \r
+               for(int i = 0; i < realId.length; i++) realId[i] = -1;\r
                handle = new Handler();\r
                this.app = activity;\r
                this.sleepTime = config.touchSleepTime;\r
@@ -172,23 +174,33 @@ public final class AndroidInput implements Input, OnKeyListener, OnTouchListener
        }\r
 \r
        @Override public int getX () {\r
-               return touchX[0];\r
+               synchronized (realId) {\r
+                       return touchX[0];\r
+               }\r
        }\r
 \r
        @Override public int getY () {\r
-               return touchY[0];\r
+               synchronized (realId) {\r
+                       return touchY[0];\r
+               }\r
        }\r
 \r
        @Override public int getX (int pointer) {\r
-               return touchX[pointer];\r
+               synchronized (realId) {\r
+                       return touchX[pointer];\r
+               }\r
        }\r
 \r
        @Override public int getY (int pointer) {\r
-               return touchY[pointer];\r
+               synchronized (realId) {\r
+                       return touchY[pointer];\r
+               }\r
        }\r
 \r
        public boolean isTouched (int pointer) {\r
-               return touched[pointer];\r
+               synchronized (realId) {\r
+                       return touched[pointer];\r
+               }\r
        }\r
 \r
        @Override public boolean isKeyPressed (int key) {\r
@@ -457,4 +469,20 @@ public final class AndroidInput implements Input, OnKeyListener, OnTouchListener
                if(peripheral == Peripheral.MultitouchScreen) return hasMultitouch;\r
                return false;\r
        }\r
+       \r
+       public int getFreePointerIndex() {\r
+               int len = realId.length;\r
+               for(int i = 0; i < len; i++) {\r
+                       if(realId[i] == -1) return i;\r
+               }\r
+               return -1;\r
+       }\r
+       \r
+       public int lookUpPointerIndex(int pointerId) {\r
+               int len = realId.length;\r
+               for(int i = 0; i < len; i++) {\r
+                       if(realId[i] == pointerId) return i;\r
+               }\r
+               return -1;\r
+       }\r
 }\r
index 061215e..3ee65e0 100644 (file)
@@ -30,45 +30,53 @@ public class AndroidMultiTouchHandler implements AndroidTouchHandler {
        public void onTouch (MotionEvent event, AndroidInput input) {\r
                final int action = event.getAction() & MotionEvent.ACTION_MASK;\r
                int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;\r
-               int pointerId = event.getPointerId(pointerIndex);\r
-\r
+               int pointerId = event.getPointerId(pointerIndex);               \r
+               \r
                int x = 0, y = 0;\r
+               int realPointerIndex = 0;\r
 \r
-               switch (action) {\r
-               case MotionEvent.ACTION_DOWN:\r
-               case MotionEvent.ACTION_POINTER_DOWN:\r
-                       x = (int)event.getX(pointerIndex);\r
-                       y = (int)event.getY(pointerIndex);\r
-                       postTouchEvent(input, TouchEvent.TOUCH_DOWN, x, y, pointerId);\r
-                       input.touchX[pointerId] = x;\r
-                       input.touchY[pointerId] = y;\r
-                       input.touched[pointerId] = true;\r
-                       break;\r
-\r
-               case MotionEvent.ACTION_UP:\r
-               case MotionEvent.ACTION_POINTER_UP:\r
-               case MotionEvent.ACTION_OUTSIDE:\r
-               case MotionEvent.ACTION_CANCEL:\r
-                       x = (int)event.getX(pointerIndex);\r
-                       y = (int)event.getY(pointerIndex);\r
-                       postTouchEvent(input, TouchEvent.TOUCH_UP, x, y, pointerId);\r
-                       input.touchX[pointerId] = x;\r
-                       input.touchY[pointerId] = y;\r
-                       input.touched[pointerId] = false;\r
-                       break;\r
-\r
-               case MotionEvent.ACTION_MOVE:\r
-                       int pointerCount = event.getPointerCount();\r
-                       for (int i = 0; i < pointerCount; i++) {\r
-                               pointerIndex = i;\r
-                               pointerId = event.getPointerId(pointerIndex);\r
+               synchronized(input.realId) { // FUCK \r
+                       switch (action) {\r
+                       case MotionEvent.ACTION_DOWN:\r
+                       case MotionEvent.ACTION_POINTER_DOWN:\r
+                               realPointerIndex = input.getFreePointerIndex(); // get a free pointer index as reported by Input.getX() etc.\r
+                               input.realId[realPointerIndex] = pointerId;\r
+                               x = (int)event.getX(pointerIndex);\r
+                               y = (int)event.getY(pointerIndex);\r
+                               postTouchEvent(input, TouchEvent.TOUCH_DOWN, x, y, realPointerIndex);\r
+                               input.touchX[realPointerIndex] = x;\r
+                               input.touchY[realPointerIndex] = y;\r
+                               input.touched[realPointerIndex] = true;\r
+                               break;\r
+       \r
+                       case MotionEvent.ACTION_UP:\r
+                       case MotionEvent.ACTION_POINTER_UP:\r
+                       case MotionEvent.ACTION_OUTSIDE:\r
+                       case MotionEvent.ACTION_CANCEL:\r
+                               realPointerIndex = input.lookUpPointerIndex(pointerId);\r
+                               input.realId[realPointerIndex] = -1;\r
                                x = (int)event.getX(pointerIndex);\r
                                y = (int)event.getY(pointerIndex);\r
-                               postTouchEvent(input, TouchEvent.TOUCH_DRAGGED, x, y, pointerId);\r
-                               input.touchX[pointerId] = x;\r
-                               input.touchY[pointerId] = y;\r
+                               postTouchEvent(input, TouchEvent.TOUCH_UP, x, y, realPointerIndex);\r
+                               input.touchX[realPointerIndex] = x;\r
+                               input.touchY[realPointerIndex] = y;\r
+                               input.touched[realPointerIndex] = false;\r
+                               break;\r
+       \r
+                       case MotionEvent.ACTION_MOVE:\r
+                               int pointerCount = event.getPointerCount();\r
+                               for (int i = 0; i < pointerCount; i++) {\r
+                                       pointerIndex = i;\r
+                                       pointerId = event.getPointerId(pointerIndex);\r
+                                       x = (int)event.getX(pointerIndex);\r
+                                       y = (int)event.getY(pointerIndex);\r
+                                       realPointerIndex = input.lookUpPointerIndex(pointerId);\r
+                                       postTouchEvent(input, TouchEvent.TOUCH_DRAGGED, x, y, realPointerIndex);\r
+                                       input.touchX[realPointerIndex] = x;\r
+                                       input.touchY[realPointerIndex] = y;\r
+                               }\r
+                               break;\r
                        }\r
-                       break;\r
                }\r
        }\r
 \r