diff options
author | Mitsuru Oshima <oshima@google.com> | 2009-06-21 00:03:11 -0700 |
---|---|---|
committer | Mitsuru Oshima <oshima@google.com> | 2009-06-23 23:11:55 -0700 |
commit | 64f59342d41849bd365cb43fad7505d5e3daa417 (patch) | |
tree | b0cef479b2674ee78a8bff6e833224850a36f2ab /core/java/android/view/SurfaceView.java | |
parent | 5a42b08389f3fe9195930ce5d2998e68bb09b748 (diff) | |
download | frameworks_base-64f59342d41849bd365cb43fad7505d5e3daa417.zip frameworks_base-64f59342d41849bd365cb43fad7505d5e3daa417.tar.gz frameworks_base-64f59342d41849bd365cb43fad7505d5e3daa417.tar.bz2 |
* new screen resolution support impl.
* use full window for activities, and shift & clip the content
* refactored the compatibility code, and introdcued Translator class to handle cooridnate translations.
* removed a workaround to handle an activity with configChagne=rotation in old implementation.
* I'll fix background issue on rotation in next CL.
* removed unnecessary scaling code in SurfaceView, which I forgot to remove when I changed SurfaceView
not to scale the content.
Diffstat (limited to 'core/java/android/view/SurfaceView.java')
-rw-r--r-- | core/java/android/view/SurfaceView.java | 58 |
1 files changed, 23 insertions, 35 deletions
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 082cca2..45b0f0a 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -18,6 +18,7 @@ package android.view; import android.content.Context; import android.content.res.CompatibilityInfo; +import android.content.res.CompatibilityInfo.Translator; import android.graphics.Canvas; import android.graphics.PixelFormat; import android.graphics.PorterDuff; @@ -138,24 +139,21 @@ public class SurfaceView extends View { int mFormat = -1; int mType = -1; final Rect mSurfaceFrame = new Rect(); - private final CompatibilityInfo mCompatibilityInfo; + private Translator mTranslator; public SurfaceView(Context context) { super(context); setWillNotDraw(true); - mCompatibilityInfo = context.getResources().getCompatibilityInfo(); } public SurfaceView(Context context, AttributeSet attrs) { super(context, attrs); setWillNotDraw(true); - mCompatibilityInfo = context.getResources().getCompatibilityInfo(); } public SurfaceView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setWillNotDraw(true); - mCompatibilityInfo = context.getResources().getCompatibilityInfo(); } /** @@ -258,9 +256,9 @@ public class SurfaceView extends View { 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 (mRequestedWidth < 0 && mCompatibilityInfo.mScalingRequired) { + if (mRequestedWidth < 0 && mTranslator != null) { MotionEvent scaledBack = MotionEvent.obtain(event); - scaledBack.scale(mCompatibilityInfo.mApplicationScale); + scaledBack.scale(mTranslator.applicationScale); try { return super.dispatchTouchEvent(scaledBack); } finally { @@ -297,15 +295,18 @@ public class SurfaceView extends View { if (!mHaveFrame) { return; } - float appScale = mCompatibilityInfo.mApplicationScale; + mTranslator = ((ViewRoot)getRootView().getParent()).mTranslator; + + float appScale = mTranslator == null ? 1.0f : mTranslator.applicationScale; int myWidth = mRequestedWidth; if (myWidth <= 0) myWidth = getWidth(); int myHeight = mRequestedHeight; if (myHeight <= 0) myHeight = getHeight(); - // Use original size for surface unless fixed size is requested. - if (mRequestedWidth <= 0 && mCompatibilityInfo.mScalingRequired) { + // Use original size if the app specified the size of the view, + // and let the flinger to scale up. + if (mRequestedWidth <= 0 && mTranslator != null && mTranslator.scalingRequired) { myWidth *= appScale; myHeight *= appScale; } @@ -325,7 +326,7 @@ public class SurfaceView extends View { + " visible=" + visibleChanged + " left=" + (mLeft != mLocation[0]) + " top=" + (mTop != mLocation[1])); - + try { final boolean visible = mVisible = mRequestedVisible; mLeft = mLocation[0]; @@ -335,16 +336,23 @@ public class SurfaceView extends View { mFormat = mRequestedFormat; mType = mRequestedType; - // Scaling window's layout here because mLayout is not used elsewhere. - mLayout.x = (int) (mLeft * appScale); - mLayout.y = (int) (mTop * appScale); - mLayout.width = (int) (getWidth() * appScale); - mLayout.height = (int) (getHeight() * appScale); + // Scaling/Translate window's layout here because mLayout is not used elsewhere. + + // Places the window relative + mLayout.x = mLeft; + mLayout.y = mTop; + mLayout.width = getWidth(); + mLayout.height = getHeight(); + if (mTranslator != null) { + mTranslator.translateLayoutParamsInAppWindowToScreen(mLayout); + } + mLayout.format = mRequestedFormat; mLayout.flags |=WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_SCALED | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + | WindowManager.LayoutParams.FLAG_NO_COMPATIBILITY_SCALING ; mLayout.memoryType = mRequestedType; @@ -371,13 +379,6 @@ public class SurfaceView extends View { visible ? VISIBLE : GONE, false, mWinFrame, mContentInsets, mVisibleInsets, mSurface); - if (mCompatibilityInfo.mScalingRequired) { - float invertedScale = mCompatibilityInfo.mApplicationInvertedScale; - mContentInsets.scale(invertedScale); - mVisibleInsets.scale(invertedScale); - mWinFrame.scale(invertedScale); - } - if (localLOGV) Log.i(TAG, "New surface: " + mSurface + ", vis=" + visible + ", frame=" + mWinFrame); mSurfaceFrame.left = 0; @@ -446,24 +447,14 @@ public class SurfaceView extends View { private static class MyWindow extends IWindow.Stub { private final WeakReference<SurfaceView> mSurfaceView; - private final CompatibilityInfo mCompatibilityInfo; public MyWindow(SurfaceView surfaceView) { mSurfaceView = new WeakReference<SurfaceView>(surfaceView); - mCompatibilityInfo = surfaceView.getContext().getResources().getCompatibilityInfo(); } public void resized(int w, int h, Rect coveredInsets, Rect visibleInsets, boolean reportDraw) { SurfaceView surfaceView = mSurfaceView.get(); - if (mCompatibilityInfo.mScalingRequired) { - float scale = mCompatibilityInfo.mApplicationInvertedScale; - w *= scale; - h *= scale; - coveredInsets.scale(scale); - visibleInsets.scale(scale); - } - if (surfaceView != null) { if (localLOGV) Log.v( "SurfaceView", surfaceView + " got resized: w=" + @@ -626,9 +617,6 @@ public class SurfaceView extends View { Canvas c = null; if (!mDrawingStopped && mWindow != null) { Rect frame = dirty != null ? dirty : mSurfaceFrame; - if (mCompatibilityInfo.mScalingRequired) { - frame.scale(mCompatibilityInfo.mApplicationScale); - } try { c = mSurface.lockCanvas(frame); } catch (Exception e) { |