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.
This commit is contained in:
Android (Google) Code Review
2009-07-22 14:42:08 -07:00

View File

@ -141,6 +141,13 @@ public class SurfaceView extends View {
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;
@ -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);