Fixes bug #1506, Changing orientation on the Android device throws off touch scaling
authorGabriel Jacobo <gabomdq@gmail.com>
Fri, 24 Aug 2012 13:10:29 -0300
changeset 6400 2ed5671bc5e0
parent 6399 3fb0c82693af
child 6401 a4bd9821a796
Fixes bug #1506, Changing orientation on the Android device throws off touch scaling
android-project/src/org/libsdl/app/SDLActivity.java
src/video/android/SDL_androidtouch.c
--- a/android-project/src/org/libsdl/app/SDLActivity.java	Fri Aug 24 11:56:21 2012 -0300
+++ b/android-project/src/org/libsdl/app/SDLActivity.java	Fri Aug 24 13:10:29 2012 -0300
@@ -449,6 +449,9 @@
     // Sensors
     private static SensorManager mSensorManager;
 
+    // Keep track of the surface size to normalize touch events
+    private static float mWidth, mHeight;
+
     // Startup    
     public SDLSurface(Context context) {
         super(context);
@@ -460,7 +463,11 @@
         setOnKeyListener(this); 
         setOnTouchListener(this);   
 
-        mSensorManager = (SensorManager)context.getSystemService("sensor");  
+        mSensorManager = (SensorManager)context.getSystemService("sensor");
+
+        // Some arbitrary defaults to avoid a potential division by zero
+        mWidth = 1.0f;
+        mHeight = 1.0f;
     }
 
     // Called when we have a valid drawing surface
@@ -529,6 +536,9 @@
             Log.v("SDL", "pixel format unknown " + format);
             break;
         }
+
+        mWidth = (float) width;
+        mHeight = (float) height;
         SDLActivity.onNativeResize(width, height, sdlFormat);
         Log.v("SDL", "Window size:" + width + "x"+height);
 
@@ -568,8 +578,8 @@
              int pointerFingerId = event.getPointerId(actionPointerIndex);
              int action = (event.getAction() & MotionEvent.ACTION_MASK); /* API 8: event.getActionMasked(); */
 
-             float x = event.getX(actionPointerIndex);
-             float y = event.getY(actionPointerIndex);
+             float x = event.getX(actionPointerIndex) / mWidth;
+             float y = event.getY(actionPointerIndex) / mHeight;
              float p = event.getPressure(actionPointerIndex);
 
              if (action == MotionEvent.ACTION_MOVE && pointerCount > 1) {
@@ -577,8 +587,8 @@
                 // changed since prev event.
                 for (int i = 0; i < pointerCount; i++) {
                     pointerFingerId = event.getPointerId(i);
-                    x = event.getX(i);
-                    y = event.getY(i);
+                    x = event.getX(i) / mWidth;
+                    y = event.getY(i) / mHeight;
                     p = event.getPressure(i);
                     SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
                 }
--- a/src/video/android/SDL_androidtouch.c	Fri Aug 24 11:56:21 2012 -0300
+++ b/src/video/android/SDL_androidtouch.c	Fri Aug 24 13:10:29 2012 -0300
@@ -55,10 +55,10 @@
         memset( &touch, 0, sizeof(touch) );
         touch.id = touchDeviceId;
         touch.x_min = 0.0f;
-        touch.x_max = (float)Android_ScreenWidth;
+        touch.x_max = 1.0f;
         touch.native_xres = touch.x_max - touch.x_min;
         touch.y_min = 0.0f;
-        touch.y_max = (float)Android_ScreenHeight;
+        touch.y_max = 1.0f;
         touch.native_yres = touch.y_max - touch.y_min;
         touch.pressure_min = 0.0f;
         touch.pressure_max = 1.0f;