OSDN Git Service

Sharesheet - Fix scroll behavior moving past bounds
authorMatt Pietal <mpietal@google.com>
Mon, 8 Apr 2019 13:57:07 +0000 (09:57 -0400)
committerMatt Pietal <mpietal@google.com>
Mon, 8 Apr 2019 13:57:07 +0000 (09:57 -0400)
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

core/java/com/android/internal/widget/ResolverDrawerLayout.java

index 329c6b3..66bbe22 100644 (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);