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.
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 @@
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 @@
@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 @@
mWindowType = type;
}
- boolean mScaled = false;
-
private void updateWindow(boolean force) {
if (!mHaveFrame) {
return;
@@ -301,7 +309,7 @@
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 @@
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 @@
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 void unlockCanvasAndPost(Canvas canvas) {
- if (mScaled) {
+ if (mCanvasScaled) {
canvas.restoreToCount(mSaveCount);
}
mSurface.unlockCanvasAndPost(canvas);