summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorMitsuru Oshima <oshima@google.com>2009-05-13 22:29:15 -0700
committerMitsuru Oshima <oshima@google.com>2009-05-14 12:59:40 -0700
commit3d91492d694cf00474fec792134e496be6ee0313 (patch)
tree7f1043722141e1f051cdbe135285133cf07e6638 /core/java
parent02c1c46fff22490f884f05520d58eadae1442db8 (diff)
downloadframeworks_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.java7
-rw-r--r--core/java/android/view/ViewRoot.java23
-rw-r--r--core/java/android/view/WindowManager.java26
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 = "";
}
}