Crop surface to the content size during drag-resizing
During drag-resizing, a fullscreen-sized surface is reused to optimize reallocations, which can leave outdated app content on the surface when resizing to a smaller size. This outdated app content can then be briefly exposed to the user when drag-resizing to a larger size until the app draws again and fills the new size. To "clear" this garbage content, this change crops the content directly from the client side during drag-resizing. The "gap" between the cropped app content and the larger task that's in sync with the drag-gesture is now the solid background color of the task surface instead of the former garbage app content. Bug: 270202228 Test: quickly drag-resize a freeform task to a smaller and then a larger size, verify that the "gap" exposed while the app draw catches up to the resize gesture is now a solid color instead of artifacts from a previous app draw. Change-Id: Ibc3ca2a8f5b83b3fef2fe4832f93ca52d3b156a8
This commit is contained in:
@@ -8317,10 +8317,20 @@ public final class ViewRootImpl implements ViewParent,
|
||||
}
|
||||
}
|
||||
|
||||
if (mSurfaceControl.isValid() && !HardwareRenderer.isDrawingEnabled()) {
|
||||
// When drawing is disabled the window layer won't have a valid buffer.
|
||||
// Set a window crop so input can get delivered to the window.
|
||||
mTransaction.setWindowCrop(mSurfaceControl, mSurfaceSize.x, mSurfaceSize.y).apply();
|
||||
if (mSurfaceControl.isValid()) {
|
||||
if (mPendingDragResizing && !mSurfaceSize.equals(
|
||||
mWinFrameInScreen.width(), mWinFrameInScreen.height())) {
|
||||
// During drag-resize, a single fullscreen-sized surface is reused for optimization.
|
||||
// Crop to the content size instead of the surface size to avoid exposing garbage
|
||||
// content that is still on the surface from previous re-layouts (e.g. when
|
||||
// resizing to a larger size).
|
||||
mTransaction.setWindowCrop(mSurfaceControl,
|
||||
mWinFrameInScreen.width(), mWinFrameInScreen.height());
|
||||
} else if (!HardwareRenderer.isDrawingEnabled()) {
|
||||
// When drawing is disabled the window layer won't have a valid buffer.
|
||||
// Set a window crop so input can get delivered to the window.
|
||||
mTransaction.setWindowCrop(mSurfaceControl, mSurfaceSize.x, mSurfaceSize.y).apply();
|
||||
}
|
||||
}
|
||||
|
||||
mLastTransformHint = transformHint;
|
||||
|
||||
Reference in New Issue
Block a user