Merge change 1638 into donut

* changes:
  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.
This commit is contained in:
Android (Google) Code Review
2009-05-14 13:00:05 -07:00
3 changed files with 47 additions and 9 deletions

View File

@@ -326,8 +326,9 @@ public class SurfaceView extends View {
mFormat = mRequestedFormat; mFormat = mRequestedFormat;
mType = mRequestedType; mType = mRequestedType;
mLayout.x = mLeft; // Scaling window's layout here beause mLayout is not used elsewhere.
mLayout.y = mTop; mLayout.x = (int) (mLeft * mAppScale);
mLayout.y = (int) (mTop * mAppScale);
mLayout.width = (int) (getWidth() * mAppScale); mLayout.width = (int) (getWidth() * mAppScale);
mLayout.height = (int) (getHeight() * mAppScale); mLayout.height = (int) (getHeight() * mAppScale);
mLayout.format = mRequestedFormat; mLayout.format = mRequestedFormat;

View File

@@ -123,9 +123,10 @@ public final class ViewRoot extends Handler implements ViewParent,
int mHeight; int mHeight;
Rect mDirty; // will be a graphics.Region soon Rect mDirty; // will be a graphics.Region soon
boolean mIsAnimating; boolean mIsAnimating;
// TODO: change these to scaler class. // TODO: change these to scalar class.
float mAppScale; private float mAppScale;
float mAppScaleInverted; // = 1.0f / mAppScale private float mAppScaleInverted; // = 1.0f / mAppScale
private int[] mWindowLayoutParamsBackup = null;
final View.AttachInfo mAttachInfo; final View.AttachInfo mAttachInfo;
@@ -384,6 +385,9 @@ public final class ViewRoot extends Handler implements ViewParent,
if (mView == null) { if (mView == null) {
mView = view; mView = view;
mAppScale = mView.getContext().getApplicationScale(); mAppScale = mView.getContext().getApplicationScale();
if (mAppScale != 1.0f) {
mWindowLayoutParamsBackup = new int[4];
}
mAppScaleInverted = 1.0f / mAppScale; mAppScaleInverted = 1.0f / mAppScale;
mWindowAttributes.copyFrom(attrs); mWindowAttributes.copyFrom(attrs);
mSoftInputMode = attrs.softInputMode; mSoftInputMode = attrs.softInputMode;
@@ -473,7 +477,6 @@ public final class ViewRoot extends Handler implements ViewParent,
synchronized (this) { synchronized (this) {
int oldSoftInputMode = mWindowAttributes.softInputMode; int oldSoftInputMode = mWindowAttributes.softInputMode;
mWindowAttributes.copyFrom(attrs); mWindowAttributes.copyFrom(attrs);
mWindowAttributes.scale(mAppScale);
if (newView) { if (newView) {
mSoftInputMode = attrs.softInputMode; mSoftInputMode = attrs.softInputMode;
@@ -2320,12 +2323,22 @@ public final class ViewRoot extends Handler implements ViewParent,
private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility, private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
boolean insetsPending) throws RemoteException { boolean insetsPending) throws RemoteException {
boolean restore = false;
if (params != null && mAppScale != 1.0f) {
restore = true;
params.scale(mAppScale, mWindowLayoutParamsBackup);
}
int relayoutResult = sWindowSession.relayout( int relayoutResult = sWindowSession.relayout(
mWindow, params, mWindow, params,
(int) (mView.mMeasuredWidth * mAppScale), (int) (mView.mMeasuredWidth * mAppScale),
(int) (mView.mMeasuredHeight * mAppScale), (int) (mView.mMeasuredHeight * mAppScale),
viewVisibility, insetsPending, mWinFrame, viewVisibility, insetsPending, mWinFrame,
mPendingContentInsets, mPendingVisibleInsets, mSurface); mPendingContentInsets, mPendingVisibleInsets, mSurface);
if (restore) {
params.restore(mWindowLayoutParamsBackup);
}
mPendingContentInsets.scale(mAppScaleInverted); mPendingContentInsets.scale(mAppScaleInverted);
mPendingVisibleInsets.scale(mAppScaleInverted); mPendingVisibleInsets.scale(mAppScaleInverted);
mWinFrame.scale(mAppScaleInverted); mWinFrame.scale(mAppScaleInverted);

View File

@@ -18,6 +18,7 @@ package android.view;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.os.IBinder; import android.os.IBinder;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
@@ -954,19 +955,42 @@ public interface WindowManager extends ViewManager {
return sb.toString(); 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) { if (scale != 1.0f) {
backup[0] = x;
backup[1] = y;
x *= scale; x *= scale;
y *= scale; y *= scale;
if (width > 0) { if (width > 0) {
backup[2] = width;
width *= scale; width *= scale;
} }
if (height > 0) { if (height > 0) {
backup[3] = height;
height *= scale; 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 = ""; private CharSequence mTitle = "";
} }
} }