Loading core/java/android/view/SurfaceView.java +134 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.graphics.Rect; import android.graphics.Region; import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.SystemClock; import android.util.AttributeSet; Loading Loading @@ -452,6 +453,14 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb } } private void updateOpaqueFlag() { if (PixelFormat.formatHasAlpha(mRequestedFormat)) { mSurfaceFlags |= SurfaceControl.OPAQUE; } else { mSurfaceFlags &= ~SurfaceControl.OPAQUE; } } private Rect getParentSurfaceInsets() { final ViewRootImpl root = getViewRootImpl(); if (root == null) { Loading Loading @@ -522,7 +531,9 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb if (creating) { mSurfaceSession = new SurfaceSession(viewRoot.mSurface); mDeferredDestroySurfaceControl = mSurfaceControl; mSurfaceControl = new SurfaceControl(mSurfaceSession, updateOpaqueFlag(); mSurfaceControl = new SurfaceControlWithBackground(mSurfaceSession, "SurfaceView - " + viewRoot.getTitle().toString(), mSurfaceWidth, mSurfaceHeight, mFormat, mSurfaceFlags); Loading Loading @@ -1071,4 +1082,126 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb return mSurfaceFrame; } }; class SurfaceControlWithBackground extends SurfaceControl { private SurfaceControl mBackgroundControl; private boolean mOpaque = true; public boolean mVisible = false; public SurfaceControlWithBackground(SurfaceSession s, String name, int w, int h, int format, int flags) throws Exception { super(s, name, w, h, format, flags); mBackgroundControl = new SurfaceControl(s, "Background for - " + name, w, h, PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM); mOpaque = (flags & SurfaceControl.OPAQUE) != 0; } @Override public void setAlpha(float alpha) { super.setAlpha(alpha); mBackgroundControl.setAlpha(alpha); } @Override public void setLayer(int zorder) { super.setLayer(zorder); // -3 is below all other child layers as SurfaceView never goes below -2 mBackgroundControl.setLayer(-3); } @Override public void setPosition(float x, float y) { super.setPosition(x, y); mBackgroundControl.setPosition(x, y); } @Override public void setSize(int w, int h) { super.setSize(w, h); mBackgroundControl.setSize(w, h); } @Override public void setWindowCrop(Rect crop) { super.setWindowCrop(crop); mBackgroundControl.setWindowCrop(crop); } @Override public void setFinalCrop(Rect crop) { super.setFinalCrop(crop); mBackgroundControl.setFinalCrop(crop); } @Override public void setLayerStack(int layerStack) { super.setLayerStack(layerStack); mBackgroundControl.setLayerStack(layerStack); } @Override public void setOpaque(boolean isOpaque) { super.setOpaque(isOpaque); mOpaque = isOpaque; updateBackgroundVisibility(); } @Override public void setSecure(boolean isSecure) { super.setSecure(isSecure); } @Override public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { super.setMatrix(dsdx, dtdx, dsdy, dtdy); mBackgroundControl.setMatrix(dsdx, dtdx, dsdy, dtdy); } @Override public void hide() { super.hide(); mVisible = false; updateBackgroundVisibility(); } @Override public void show() { super.show(); mVisible = true; updateBackgroundVisibility(); } @Override public void destroy() { super.destroy(); mBackgroundControl.destroy(); } @Override public void release() { super.release(); mBackgroundControl.release(); } @Override public void setTransparentRegionHint(Region region) { super.setTransparentRegionHint(region); mBackgroundControl.setTransparentRegionHint(region); } @Override public void deferTransactionUntil(IBinder handle, long frame) { super.deferTransactionUntil(handle, frame); mBackgroundControl.deferTransactionUntil(handle, frame); } void updateBackgroundVisibility() { if (mOpaque && mVisible) { mBackgroundControl.show(); } else { mBackgroundControl.hide(); } } } } Loading
core/java/android/view/SurfaceView.java +134 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.graphics.Rect; import android.graphics.Region; import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.SystemClock; import android.util.AttributeSet; Loading Loading @@ -452,6 +453,14 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb } } private void updateOpaqueFlag() { if (PixelFormat.formatHasAlpha(mRequestedFormat)) { mSurfaceFlags |= SurfaceControl.OPAQUE; } else { mSurfaceFlags &= ~SurfaceControl.OPAQUE; } } private Rect getParentSurfaceInsets() { final ViewRootImpl root = getViewRootImpl(); if (root == null) { Loading Loading @@ -522,7 +531,9 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb if (creating) { mSurfaceSession = new SurfaceSession(viewRoot.mSurface); mDeferredDestroySurfaceControl = mSurfaceControl; mSurfaceControl = new SurfaceControl(mSurfaceSession, updateOpaqueFlag(); mSurfaceControl = new SurfaceControlWithBackground(mSurfaceSession, "SurfaceView - " + viewRoot.getTitle().toString(), mSurfaceWidth, mSurfaceHeight, mFormat, mSurfaceFlags); Loading Loading @@ -1071,4 +1082,126 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb return mSurfaceFrame; } }; class SurfaceControlWithBackground extends SurfaceControl { private SurfaceControl mBackgroundControl; private boolean mOpaque = true; public boolean mVisible = false; public SurfaceControlWithBackground(SurfaceSession s, String name, int w, int h, int format, int flags) throws Exception { super(s, name, w, h, format, flags); mBackgroundControl = new SurfaceControl(s, "Background for - " + name, w, h, PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM); mOpaque = (flags & SurfaceControl.OPAQUE) != 0; } @Override public void setAlpha(float alpha) { super.setAlpha(alpha); mBackgroundControl.setAlpha(alpha); } @Override public void setLayer(int zorder) { super.setLayer(zorder); // -3 is below all other child layers as SurfaceView never goes below -2 mBackgroundControl.setLayer(-3); } @Override public void setPosition(float x, float y) { super.setPosition(x, y); mBackgroundControl.setPosition(x, y); } @Override public void setSize(int w, int h) { super.setSize(w, h); mBackgroundControl.setSize(w, h); } @Override public void setWindowCrop(Rect crop) { super.setWindowCrop(crop); mBackgroundControl.setWindowCrop(crop); } @Override public void setFinalCrop(Rect crop) { super.setFinalCrop(crop); mBackgroundControl.setFinalCrop(crop); } @Override public void setLayerStack(int layerStack) { super.setLayerStack(layerStack); mBackgroundControl.setLayerStack(layerStack); } @Override public void setOpaque(boolean isOpaque) { super.setOpaque(isOpaque); mOpaque = isOpaque; updateBackgroundVisibility(); } @Override public void setSecure(boolean isSecure) { super.setSecure(isSecure); } @Override public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { super.setMatrix(dsdx, dtdx, dsdy, dtdy); mBackgroundControl.setMatrix(dsdx, dtdx, dsdy, dtdy); } @Override public void hide() { super.hide(); mVisible = false; updateBackgroundVisibility(); } @Override public void show() { super.show(); mVisible = true; updateBackgroundVisibility(); } @Override public void destroy() { super.destroy(); mBackgroundControl.destroy(); } @Override public void release() { super.release(); mBackgroundControl.release(); } @Override public void setTransparentRegionHint(Region region) { super.setTransparentRegionHint(region); mBackgroundControl.setTransparentRegionHint(region); } @Override public void deferTransactionUntil(IBinder handle, long frame) { super.deferTransactionUntil(handle, frame); mBackgroundControl.deferTransactionUntil(handle, frame); } void updateBackgroundVisibility() { if (mOpaque && mVisible) { mBackgroundControl.show(); } else { mBackgroundControl.hide(); } } } }