Move ScrollView scroll capture to the center

Avoid most floating content by centering the requested content within
the view instead of just scrolling so that it's visible.

See ag/14213766 for the corresponding RecyclerView change.

Bug: 189487659
Test: atest ScrollViewCaptureHelperTest, plus manual testing.
Change-Id: I194288cf9e568614ffd7c45b7d046a5b982829d6
This commit is contained in:
Matt Casey
2021-05-27 17:45:42 -04:00
parent ee4d86d0c1
commit 9e25d3b8b5
2 changed files with 18 additions and 5 deletions

View File

@@ -125,10 +125,19 @@ public class ScrollViewCaptureHelper implements ScrollCaptureViewHelper<ViewGrou
view.getScrollX() - contentView.getLeft(),
view.getScrollY() - contentView.getTop());
Rect input = new Rect(requestedContentBounds);
// Expand input rect to get the requested rect to be in the center
int remainingHeight = view.getHeight() - view.getPaddingTop()
- view.getPaddingBottom() - input.height();
if (remainingHeight > 0) {
input.inset(0, -remainingHeight / 2);
}
// requestRect is now local to contentView as requestedContentBounds
// contentView (and each parent in turn if possible) will be scrolled
// (if necessary) to make all of requestedContent visible, (if possible!)
contentView.requestRectangleOnScreen(new Rect(requestedContentBounds), true);
contentView.requestRectangleOnScreen(input, true);
// update new offset between starting and current scroll position
scrollDelta = view.getScrollY() - mStartScrollY;

View File

@@ -164,7 +164,8 @@ public class ScrollViewCaptureHelperTest {
assertRectEquals(request, scrollResult.requestedArea);
assertRectEquals(request, scrollResult.availableArea);
assertRequestedRectCompletelyVisible(startScrollY, request, getVisibleRect(mContent));
assertEquals(CAPTURE_HEIGHT, scrollResult.scrollDelta);
assertEquals(CAPTURE_HEIGHT + (WINDOW_HEIGHT - CAPTURE_HEIGHT) / 2,
scrollResult.scrollDelta);
}
@Test
@@ -182,7 +183,8 @@ public class ScrollViewCaptureHelperTest {
assertRectEquals(request, scrollResult.requestedArea);
assertRectEquals(request, scrollResult.availableArea);
assertRequestedRectCompletelyVisible(startScrollY, request, getVisibleRect(mContent));
assertEquals(-CAPTURE_HEIGHT, scrollResult.scrollDelta);
assertEquals(-CAPTURE_HEIGHT - (WINDOW_HEIGHT - CAPTURE_HEIGHT) / 2,
scrollResult.scrollDelta);
}
@Test
@@ -201,7 +203,8 @@ public class ScrollViewCaptureHelperTest {
assertRectEquals(request, scrollResult.requestedArea);
assertRectEquals(request, scrollResult.availableArea);
assertRequestedRectCompletelyVisible(startScrollY, request, getVisibleRect(mContent));
assertEquals(CAPTURE_HEIGHT, scrollResult.scrollDelta);
assertEquals(CAPTURE_HEIGHT + (WINDOW_HEIGHT - CAPTURE_HEIGHT) / 2,
scrollResult.scrollDelta);
}
@@ -220,7 +223,8 @@ public class ScrollViewCaptureHelperTest {
assertRectEquals(request, scrollResult.requestedArea);
assertRectEquals(request, scrollResult.availableArea);
assertRequestedRectCompletelyVisible(startScrollY, request, getVisibleRect(mContent));
assertEquals(-CAPTURE_HEIGHT, scrollResult.scrollDelta);
assertEquals(-CAPTURE_HEIGHT - (WINDOW_HEIGHT - CAPTURE_HEIGHT) / 2,
scrollResult.scrollDelta);
}
@Test