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;
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;

View File

@@ -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

View File

@@ -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 = "";
}
}