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:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user