From 2c915273563688fd36834c6b767913bbd5d7165e Mon Sep 17 00:00:00 2001 From: Gabriel Jacobo Date: Fri, 24 Aug 2012 13:10:29 -0300 Subject: [PATCH] Fixes bug #1506, Changing orientation on the Android device throws off touch scaling --- .../src/org/libsdl/app/SDLActivity.java | 20 ++++++++++++++----- src/video/android/SDL_androidtouch.c | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index 8c85428ad..685719967 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -449,6 +449,9 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, // 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 @@ public SDLSurface(Context context) { 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 @@ public void surfaceChanged(SurfaceHolder holder, 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 @@ public boolean onTouch(View v, MotionEvent event) { 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 @@ public boolean onTouch(View v, MotionEvent event) { // 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); } diff --git a/src/video/android/SDL_androidtouch.c b/src/video/android/SDL_androidtouch.c index 90ecef9d7..d577e8878 100755 --- a/src/video/android/SDL_androidtouch.c +++ b/src/video/android/SDL_androidtouch.c @@ -55,10 +55,10 @@ void Android_OnTouch(int touch_device_id_in, int pointer_finger_id_in, int actio 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;