Przeglądaj źródła

android: cleanup touch update loop

Narr the Reg 3 lat temu
rodzic
commit
5b80dee181

+ 50 - 28
src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java

@@ -341,34 +341,6 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener {
             return onTouchWhileEditing(event);
         }
 
-        int pointerIndex = event.getActionIndex();
-
-        if (mPreferences.getBoolean("isTouchEnabled", true)) {
-            switch (event.getAction() & MotionEvent.ACTION_MASK) {
-                case MotionEvent.ACTION_DOWN:
-                case MotionEvent.ACTION_POINTER_DOWN:
-                    if (NativeLibrary.onTouchEvent(event.getX(pointerIndex), event.getY(pointerIndex), true)) {
-                        mTouchscreenPointerId = event.getPointerId(pointerIndex);
-                    }
-                    break;
-                case MotionEvent.ACTION_UP:
-                case MotionEvent.ACTION_POINTER_UP:
-                    if (mTouchscreenPointerId == event.getPointerId(pointerIndex)) {
-                        // We don't really care where the touch has been released. We only care whether it has been
-                        // released or not.
-                        NativeLibrary.onTouchEvent(0, 0, false);
-                        mTouchscreenPointerId = -1;
-                    }
-                    break;
-            }
-
-            for (int i = 0; i < event.getPointerCount(); i++) {
-                if (mTouchscreenPointerId == event.getPointerId(i)) {
-                    NativeLibrary.onTouchMoved(event.getX(i), event.getY(i));
-                }
-            }
-        }
-
         for (InputOverlayDrawableButton button : overlayButtons) {
             if (!button.updateStatus(event)) {
                 continue;
@@ -395,11 +367,61 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener {
             NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, joystick.getButtonId(), joystick.getButtonStatus());
         }
 
+        if (!mPreferences.getBoolean("isTouchEnabled", true)) {
+            return true;
+        }
+
+        int pointerIndex = event.getActionIndex();
+        int xPosition = (int) event.getX(pointerIndex);
+        int yPosition = (int) event.getY(pointerIndex);
+        int pointerId = event.getPointerId(pointerIndex);
+        int motion_event = event.getAction() & MotionEvent.ACTION_MASK;
+        boolean isActionDown = motion_event == MotionEvent.ACTION_DOWN || motion_event == MotionEvent.ACTION_POINTER_DOWN;
+        boolean isActionMove = motion_event == MotionEvent.ACTION_MOVE;
+        boolean isActionUp = motion_event == MotionEvent.ACTION_UP || motion_event == MotionEvent.ACTION_POINTER_UP;
+
+        if (isActionDown && !isTouchInputConsumed(pointerId)) {
+            NativeLibrary.onTouchEvent(xPosition, yPosition, true);
+        }
+
+        if (isActionMove) {
+            for (int i = 0; i < event.getPointerCount(); i++) {
+                int fingerId = event.getPointerId(i);
+                if (isTouchInputConsumed(fingerId)) {
+                    continue;
+                }
+                NativeLibrary.onTouchMoved(event.getX(i), event.getY(i));
+            }
+        }
+
+        if (isActionUp && !isTouchInputConsumed(pointerId)) {
+            NativeLibrary.onTouchEvent(xPosition, yPosition, false);
+        }
+
         invalidate();
 
         return true;
     }
 
+    private boolean isTouchInputConsumed(int track_id) {
+        for (InputOverlayDrawableButton button : overlayButtons) {
+            if (button.getTrackId() == track_id) {
+                return true;
+            }
+        }
+        for (InputOverlayDrawableDpad dpad : overlayDpads) {
+            if (dpad.getTrackId() == track_id) {
+                return true;
+            }
+        }
+        for (InputOverlayDrawableJoystick joystick : overlayJoysticks) {
+            if (joystick.getTrackId() == track_id) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public boolean onTouchWhileEditing(MotionEvent event) {
         // TODO: Reimplement this
         return true;