Browse Source

Proper handling of scaled touch slop

Guy Carmeli 8 years ago
parent
commit
142d55b095

+ 7
- 4
android/app/src/main/java/com/reactnativenavigation/views/collapsingToolbar/CollapseCalculator.java View File

@@ -31,7 +31,8 @@ public class CollapseCalculator {
31 31
     private GestureDetector flingDetector;
32 32
     private OnFlingListener flingListener;
33 33
     private int scrollY = 0;
34
-    private int totalCollapse = 0;
34
+    private float totalCollapse = 0;
35
+    private float totalCollapseDeltaSinceTouchDown = 0;
35 36
     private final int scaledTouchSlop;
36 37
 
37 38
     public CollapseCalculator(final CollapsingView collapsingView, CollapseBehaviour collapseBehaviour) {
@@ -156,7 +157,8 @@ public class CollapseCalculator {
156 157
 
157 158
     private boolean calculateCanCollapse(float currentTopBarTranslation, float finalExpendedTranslation, float finalCollapsedTranslation) {
158 159
         return currentTopBarTranslation > finalCollapsedTranslation &&
159
-               currentTopBarTranslation <= finalExpendedTranslation;
160
+               currentTopBarTranslation <= finalExpendedTranslation &&
161
+               (scrollView.getScrollY() == 0 || (collapseBehaviour instanceof TitleBarHideOnScrollBehaviour || collapseBehaviour instanceof CollapseTitleBarBehaviour));
160 162
     }
161 163
 
162 164
     private boolean calculateCanExpend(float currentTopBarTranslation, float finalExpendedTranslation, float finalCollapsedTranslation) {
@@ -192,10 +194,10 @@ public class CollapseCalculator {
192 194
         }
193 195
         collapse = calculateCollapse(y);
194 196
         totalCollapse += collapse;
197
+        totalCollapseDeltaSinceTouchDown += Math.abs(y - previousCollapseY);
195 198
         previousCollapseY = y;
196 199
         previousTouchEvent = MotionEvent.obtain(event);
197
-        final float delta = Math.abs(y - touchDownY);
198
-        return Math.abs(delta) < scaledTouchSlop ? CollapseAmount.None : new CollapseAmount(collapse);
200
+        return totalCollapseDeltaSinceTouchDown < scaledTouchSlop ? CollapseAmount.None : new CollapseAmount(collapse);
199 201
     }
200 202
 
201 203
     private float calculateCollapse(float y) {
@@ -233,6 +235,7 @@ public class CollapseCalculator {
233 235
 
234 236
     private void saveInitialTouchY(MotionEvent event) {
235 237
         totalCollapse = 0;
238
+        totalCollapseDeltaSinceTouchDown = 0;
236 239
         touchDownY = event.getRawY();
237 240
         scrollY = scrollView.getScrollY();
238 241
         previousCollapseY = touchDownY;