diff options
| author | Chih-Chung Chang <chihchung@google.com> | 2011-09-28 17:57:10 +0800 |
|---|---|---|
| committer | Chih-Chung Chang <chihchung@google.com> | 2011-09-28 18:00:29 +0800 |
| commit | 85d4ea6fe49e97c8b569768ba63a849653adb5b1 (patch) | |
| tree | b06089ee8a0e8b4502e29cb92ed60ef6bab24123 /core/java/android/widget/MediaController.java | |
| parent | 8f0bb4bc1715ad9aaa486d010ea870ec2f43d245 (diff) | |
Fix 5158468: Update floating window size when the anchor view size changes.
Originally when surfaceChanged() happens, we remove the old window and
create a new window. This causes flickering. Now we just update the window
layout according to the size of the anchor view.
Change-Id: Id741dac07872e473f2c9829b626c5c9568e7e22d
Diffstat (limited to 'core/java/android/widget/MediaController.java')
| -rw-r--r-- | core/java/android/widget/MediaController.java | 71 |
1 files changed, 52 insertions, 19 deletions
diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java index a63b8c887e4f..90ece5d7207e 100644 --- a/core/java/android/widget/MediaController.java +++ b/core/java/android/widget/MediaController.java @@ -75,6 +75,7 @@ public class MediaController extends FrameLayout { private WindowManager mWindowManager; private Window mWindow; private View mDecor; + private WindowManager.LayoutParams mDecorLayoutParams; private ProgressBar mProgress; private TextView mEndTime, mCurrentTime; private boolean mShowing; @@ -120,6 +121,7 @@ public class MediaController extends FrameLayout { mContext = context; mUseFastForward = true; initFloatingWindow(); + initFloatingWindowLayout(); } private void initFloatingWindow() { @@ -142,6 +144,48 @@ public class MediaController extends FrameLayout { requestFocus(); } + // Allocate and initialize the static parts of mDecorLayoutParams. Must + // also call updateFloatingWindowLayout() to fill in the dynamic parts + // (y and width) before mDecorLayoutParams can be used. + private void initFloatingWindowLayout() { + mDecorLayoutParams = new WindowManager.LayoutParams(); + WindowManager.LayoutParams p = mDecorLayoutParams; + p.gravity = Gravity.TOP; + p.height = LayoutParams.WRAP_CONTENT; + p.x = 0; + p.format = PixelFormat.TRANSLUCENT; + p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; + p.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM + | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; + p.token = null; + p.windowAnimations = 0; // android.R.style.DropDownAnimationDown; + } + + // Update the dynamic parts of mDecorLayoutParams + // Must be called with mAnchor != NULL. + private void updateFloatingWindowLayout() { + int [] anchorPos = new int[2]; + mAnchor.getLocationOnScreen(anchorPos); + + WindowManager.LayoutParams p = mDecorLayoutParams; + p.width = mAnchor.getWidth(); + p.y = anchorPos[1] + mAnchor.getHeight(); + } + + // This is called whenever mAnchor's layout bound changes + private OnLayoutChangeListener mLayoutChangeListener = + new OnLayoutChangeListener() { + public void onLayoutChange(View v, int left, int top, int right, + int bottom, int oldLeft, int oldTop, int oldRight, + int oldBottom) { + updateFloatingWindowLayout(); + if (mShowing) { + mWindowManager.updateViewLayout(mDecor, mDecorLayoutParams); + } + } + }; + private OnTouchListener mTouchListener = new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { @@ -164,7 +208,13 @@ public class MediaController extends FrameLayout { * @param view The view to which to anchor the controller when it is visible. */ public void setAnchorView(View view) { + if (mAnchor != null) { + mAnchor.removeOnLayoutChangeListener(mLayoutChangeListener); + } mAnchor = view; + if (mAnchor != null) { + mAnchor.addOnLayoutChangeListener(mLayoutChangeListener); + } FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, @@ -279,31 +329,14 @@ public class MediaController extends FrameLayout { * the controller until hide() is called. */ public void show(int timeout) { - if (!mShowing && mAnchor != null) { setProgress(); if (mPauseButton != null) { mPauseButton.requestFocus(); } disableUnsupportedButtons(); - - int [] anchorpos = new int[2]; - mAnchor.getLocationOnScreen(anchorpos); - - WindowManager.LayoutParams p = new WindowManager.LayoutParams(); - p.gravity = Gravity.TOP; - p.width = mAnchor.getWidth(); - p.height = LayoutParams.WRAP_CONTENT; - p.x = 0; - p.y = anchorpos[1] + mAnchor.getHeight() - p.height; - p.format = PixelFormat.TRANSLUCENT; - p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; - p.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; - p.token = null; - p.windowAnimations = 0; // android.R.style.DropDownAnimationDown; - mWindowManager.addView(mDecor, p); + updateFloatingWindowLayout(); + mWindowManager.addView(mDecor, mDecorLayoutParams); mShowing = true; } updatePausePlay(); |
