diff options
author | Mitsuru Oshima <oshima@google.com> | 2009-05-13 22:29:15 -0700 |
---|---|---|
committer | Mitsuru Oshima <oshima@google.com> | 2009-05-14 12:59:40 -0700 |
commit | 3d91492d694cf00474fec792134e496be6ee0313 (patch) | |
tree | 7f1043722141e1f051cdbe135285133cf07e6638 /core/java | |
parent | 02c1c46fff22490f884f05520d58eadae1442db8 (diff) | |
download | frameworks_base-3d91492d694cf00474fec792134e496be6ee0313.zip frameworks_base-3d91492d694cf00474fec792134e496be6ee0313.tar.gz frameworks_base-3d91492d694cf00474fec792134e496be6ee0313.tar.bz2 |
fix window layout problem in ViewRoot
* don't scale LayoutParams (this must be app's scale).
* scale the layout params' coordinates & size only when requesting layout.
In SurfaceView, window's x,y wasn't scaled before sending to window manager.
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/view/SurfaceView.java | 7 | ||||
-rw-r--r-- | core/java/android/view/ViewRoot.java | 23 | ||||
-rw-r--r-- | core/java/android/view/WindowManager.java | 26 |
3 files changed, 47 insertions, 9 deletions
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 40b03c8..3d023f7 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -326,8 +326,9 @@ public class SurfaceView extends View { mFormat = mRequestedFormat; mType = mRequestedType; - mLayout.x = mLeft; - mLayout.y = mTop; + // Scaling window's layout here beause mLayout is not used elsewhere. + mLayout.x = (int) (mLeft * mAppScale); + mLayout.y = (int) (mTop * mAppScale); mLayout.width = (int) (getWidth() * mAppScale); mLayout.height = (int) (getHeight() * mAppScale); mLayout.format = mRequestedFormat; @@ -380,7 +381,7 @@ public class SurfaceView extends View { synchronized (mCallbacks) { callbacks = new SurfaceHolder.Callback[mCallbacks.size()]; mCallbacks.toArray(callbacks); - } + } if (visibleChanged) { mIsCreating = true; diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 90453ba..5090c56 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -123,9 +123,10 @@ public final class ViewRoot extends Handler implements ViewParent, int mHeight; Rect mDirty; // will be a graphics.Region soon boolean mIsAnimating; - // TODO: change these to scaler class. - float mAppScale; - float mAppScaleInverted; // = 1.0f / mAppScale + // TODO: change these to scalar class. + private float mAppScale; + private float mAppScaleInverted; // = 1.0f / mAppScale + private int[] mWindowLayoutParamsBackup = null; final View.AttachInfo mAttachInfo; @@ -384,6 +385,9 @@ public final class ViewRoot extends Handler implements ViewParent, if (mView == null) { mView = view; mAppScale = mView.getContext().getApplicationScale(); + if (mAppScale != 1.0f) { + mWindowLayoutParamsBackup = new int[4]; + } mAppScaleInverted = 1.0f / mAppScale; mWindowAttributes.copyFrom(attrs); mSoftInputMode = attrs.softInputMode; @@ -473,7 +477,6 @@ public final class ViewRoot extends Handler implements ViewParent, synchronized (this) { int oldSoftInputMode = mWindowAttributes.softInputMode; mWindowAttributes.copyFrom(attrs); - mWindowAttributes.scale(mAppScale); if (newView) { mSoftInputMode = attrs.softInputMode; @@ -2320,12 +2323,22 @@ public final class ViewRoot extends Handler implements ViewParent, private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility, boolean insetsPending) throws RemoteException { + + boolean restore = false; + if (params != null && mAppScale != 1.0f) { + restore = true; + params.scale(mAppScale, mWindowLayoutParamsBackup); + } int relayoutResult = sWindowSession.relayout( mWindow, params, (int) (mView.mMeasuredWidth * mAppScale), (int) (mView.mMeasuredHeight * mAppScale), viewVisibility, insetsPending, mWinFrame, mPendingContentInsets, mPendingVisibleInsets, mSurface); + if (restore) { + params.restore(mWindowLayoutParamsBackup); + } + mPendingContentInsets.scale(mAppScaleInverted); mPendingVisibleInsets.scale(mAppScaleInverted); mWinFrame.scale(mAppScaleInverted); @@ -2427,7 +2440,7 @@ public final class ViewRoot extends Handler implements ViewParent, msg.arg2 = handled ? 1 : 0; sendMessage(msg); } - + public void dispatchResized(int w, int h, Rect coveredInsets, Rect visibleInsets, boolean reportDraw) { if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": w=" + w diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index f6a171d..c69c281 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -18,6 +18,7 @@ package android.view; import android.content.pm.ActivityInfo; import android.graphics.PixelFormat; +import android.graphics.Rect; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; @@ -954,19 +955,42 @@ public interface WindowManager extends ViewManager { return sb.toString(); } - void scale(float scale) { + /** + * Scale the layout params' coordinates and size. + * Returns the original info as a backup so that the caller can + * restore the layout params; + */ + void scale(float scale, int[] backup) { if (scale != 1.0f) { + backup[0] = x; + backup[1] = y; x *= scale; y *= scale; if (width > 0) { + backup[2] = width; width *= scale; } if (height > 0) { + backup[3] = height; height *= scale; } } } + /** + * Restore the layout params' coordinates and size. + */ + void restore(int[] backup) { + x = backup[0]; + y = backup[1]; + if (width > 0) { + width = backup[2]; + } + if (height > 0) { + height = backup[3]; + } + } + private CharSequence mTitle = ""; } } |