From f2499fa434521a8948387afe8f0acd4f39620500 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Wed, 26 Jan 2011 18:31:23 -0800 Subject: [PATCH] Make sure that we update SurfaceView's window with display lists. Bug #3395487 Change-Id: Idaef3953a596ee3b4049a2d8aef6dda676b1545b --- core/java/android/view/SurfaceView.java | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 8a95664adb388..988ccefc097eb 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -163,7 +163,18 @@ public class SurfaceView extends View { boolean mUpdateWindowNeeded; boolean mReportDrawNeeded; private Translator mTranslator; - + + private final ViewTreeObserver.OnPreDrawListener mDrawListener = + new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + // reposition ourselves where the surface is + mHaveFrame = true; + updateWindow(false, false); + return true; + } + }; + public SurfaceView(Context context) { super(context); init(); @@ -201,7 +212,9 @@ public class SurfaceView extends View { mLayout.token = getWindowToken(); mLayout.setTitle("SurfaceView"); mViewVisibility = getVisibility() == VISIBLE; - getViewTreeObserver().addOnScrollChangedListener(mScrollChangedListener); + ViewTreeObserver observer = getViewTreeObserver(); + observer.addOnScrollChangedListener(mScrollChangedListener); + observer.addOnPreDrawListener(mDrawListener); } @Override @@ -262,7 +275,9 @@ public class SurfaceView extends View { @Override protected void onDetachedFromWindow() { - getViewTreeObserver().removeOnScrollChangedListener(mScrollChangedListener); + ViewTreeObserver observer = getViewTreeObserver(); + observer.removeOnScrollChangedListener(mScrollChangedListener); + observer.removeOnPreDrawListener(mDrawListener); mRequestedVisible = false; updateWindow(false, false); mHaveFrame = false; @@ -346,9 +361,6 @@ public class SurfaceView extends View { canvas.drawColor(0, PorterDuff.Mode.CLEAR); } } - // reposition ourselves where the surface is - mHaveFrame = true; - updateWindow(false, false); super.dispatchDraw(canvas); }