diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-07-22 14:42:08 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-07-22 14:42:08 -0700 |
commit | 98a44df4b4cc8cd28276ad888a7e17f81353ae44 (patch) | |
tree | 6c2d724e49f5a371ce824b998db20606d0050da7 /core/java/android | |
parent | 0b1a255f736851342016e657ba6ccf096a9497ea (diff) | |
parent | 424f668545c8b1423f46ed1286146393a8e4bc1a (diff) | |
download | frameworks_base-98a44df4b4cc8cd28276ad888a7e17f81353ae44.zip frameworks_base-98a44df4b4cc8cd28276ad888a7e17f81353ae44.tar.gz frameworks_base-98a44df4b4cc8cd28276ad888a7e17f81353ae44.tar.bz2 |
Merge change 8235 into donut
* changes:
* Revert the change that I introduced while refactroing in SurfaceView#dispatchTouchEvent * Don't scale back the event if the canvas is used in SurfaceView.
Diffstat (limited to 'core/java/android')
-rw-r--r-- | core/java/android/view/SurfaceView.java | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 95bba97..c73d29e 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -140,7 +140,14 @@ public class SurfaceView extends View { int mType = -1; final Rect mSurfaceFrame = new Rect(); private Translator mTranslator; - + + // A flag to indicate that the Canvas has to be scaled + private boolean mScaleCanvas = false; + // A flag to indicate that the Canvas is in use and being scaled. + // This may remain to be false even if mScaleCanvas is true if the applicatio + // does not use the canvas (such as GLSurfaceView, VideoView). + private boolean mCanvasScaled = false; + public SurfaceView(Context context) { super(context); setWillNotDraw(true); @@ -254,18 +261,21 @@ public class SurfaceView extends View { @Override public boolean dispatchTouchEvent(MotionEvent event) { - // SurfaceView uses pre-scaled size unless fixed size is requested. This hook - // scales the event back to the pre-scaled coordinates for such surface. - if (mScaled) { + if (mTranslator == null || mCanvasScaled) { + // Use the event as is if no scaling is required, or the surface's canvas + // is scaled too. + return super.dispatchTouchEvent(event); + } else { + // The surface is in native size, so we need to scale the event + // back to native location. MotionEvent scaledBack = MotionEvent.obtain(event); - mTranslator.translateEventInScreenToAppWindow(event); + // scale back to original + scaledBack.scale(mTranslator.applicationScale); try { return super.dispatchTouchEvent(scaledBack); } finally { scaledBack.recycle(); } - } else { - return super.dispatchTouchEvent(event); } } @@ -291,8 +301,6 @@ public class SurfaceView extends View { mWindowType = type; } - boolean mScaled = false; - private void updateWindow(boolean force) { if (!mHaveFrame) { return; @@ -301,7 +309,7 @@ public class SurfaceView extends View { mTranslator = viewRoot.mTranslator; float appScale = mTranslator == null ? 1.0f : mTranslator.applicationScale; - + Resources res = getContext().getResources(); if (mTranslator != null || !res.getCompatibilityInfo().supportsScreen()) { mSurface.setCompatibleDisplayMetrics(res.getDisplayMetrics()); @@ -312,14 +320,15 @@ public class SurfaceView extends View { int myHeight = mRequestedHeight; if (myHeight <= 0) myHeight = getHeight(); - // Use original size if the app specified the size of the view, - // and let the flinger to scale up. + // Use requested size if the app specified the size of the view + // and let the flinger to scale up. Otherwise, use the native size + // (* appScale) and assume the application can handle it. if (mRequestedWidth <= 0 && mTranslator != null) { myWidth = (int) (myWidth * appScale + 0.5f); myHeight = (int) (myHeight * appScale + 0.5f); - mScaled = true; + mScaleCanvas = true; } else { - mScaled = false; + mScaleCanvas = false; } getLocationInWindow(mLocation); @@ -641,7 +650,9 @@ public class SurfaceView extends View { if (localLOGV) Log.i(TAG, "Returned canvas: " + c); if (c != null) { mLastLockTime = SystemClock.uptimeMillis(); - if (mScaled) { + if (mScaleCanvas) { + // When the canvas is scaled, don't scale back the event's location. + mCanvasScaled = true; mSaveCount = c.save(); mTranslator.translateCanvas(c); } @@ -667,7 +678,7 @@ public class SurfaceView extends View { } public void unlockCanvasAndPost(Canvas canvas) { - if (mScaled) { + if (mCanvasScaled) { canvas.restoreToCount(mSaveCount); } mSurface.unlockCanvasAndPost(canvas); |