Sharesheet - Fix scroll behavior moving past bounds

ResolverDrawerLayout is tracking fractions of pixels, but just drops
these fractions when offsetting the child views. When scrolling up and
down continuously, this can lead to the view scrolling past the window
bounds. Do not discard these fractions. Track the remainders and add
them in when the sum to >= 1px.

Bug: 129979914
Test: Manual scrolling test
Change-Id: I0e8ea04baca341c6b6e0573e086f3f2f8c2b39b5
This commit is contained in:
Matt Pietal
2019-04-08 09:57:07 -04:00
parent e0283ded0a
commit d568294c1a

View File

@@ -73,6 +73,11 @@ public class ResolverDrawerLayout extends ViewGroup {
*/
private float mCollapseOffset;
/**
* Track fractions of pixels from drag calculations. Without this, the view offsets get
* out of sync due to frequently dropping fractions of a pixel from '(int) dy' casts.
*/
private float mDragRemainder = 0.0f;
private int mCollapsibleHeight;
private int mUncollapsibleHeight;
private int mAlwaysShowHeight;
@@ -485,6 +490,16 @@ public class ResolverDrawerLayout extends ViewGroup {
mCollapsibleHeight + mUncollapsibleHeight));
if (newPos != mCollapseOffset) {
dy = newPos - mCollapseOffset;
mDragRemainder += dy - (int) dy;
if (mDragRemainder >= 1.0f) {
mDragRemainder -= 1.0f;
dy += 1.0f;
} else if (mDragRemainder <= -1.0f) {
mDragRemainder += 1.0f;
dy -= 1.0f;
}
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);