瀏覽代碼

Proper handling of scaled touch slop

Guy Carmeli 8 年之前
父節點
當前提交
142d55b095

+ 7
- 4
android/app/src/main/java/com/reactnativenavigation/views/collapsingToolbar/CollapseCalculator.java 查看文件

31
     private GestureDetector flingDetector;
31
     private GestureDetector flingDetector;
32
     private OnFlingListener flingListener;
32
     private OnFlingListener flingListener;
33
     private int scrollY = 0;
33
     private int scrollY = 0;
34
-    private int totalCollapse = 0;
34
+    private float totalCollapse = 0;
35
+    private float totalCollapseDeltaSinceTouchDown = 0;
35
     private final int scaledTouchSlop;
36
     private final int scaledTouchSlop;
36
 
37
 
37
     public CollapseCalculator(final CollapsingView collapsingView, CollapseBehaviour collapseBehaviour) {
38
     public CollapseCalculator(final CollapsingView collapsingView, CollapseBehaviour collapseBehaviour) {
156
 
157
 
157
     private boolean calculateCanCollapse(float currentTopBarTranslation, float finalExpendedTranslation, float finalCollapsedTranslation) {
158
     private boolean calculateCanCollapse(float currentTopBarTranslation, float finalExpendedTranslation, float finalCollapsedTranslation) {
158
         return currentTopBarTranslation > finalCollapsedTranslation &&
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
     private boolean calculateCanExpend(float currentTopBarTranslation, float finalExpendedTranslation, float finalCollapsedTranslation) {
164
     private boolean calculateCanExpend(float currentTopBarTranslation, float finalExpendedTranslation, float finalCollapsedTranslation) {
192
         }
194
         }
193
         collapse = calculateCollapse(y);
195
         collapse = calculateCollapse(y);
194
         totalCollapse += collapse;
196
         totalCollapse += collapse;
197
+        totalCollapseDeltaSinceTouchDown += Math.abs(y - previousCollapseY);
195
         previousCollapseY = y;
198
         previousCollapseY = y;
196
         previousTouchEvent = MotionEvent.obtain(event);
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
     private float calculateCollapse(float y) {
203
     private float calculateCollapse(float y) {
233
 
235
 
234
     private void saveInitialTouchY(MotionEvent event) {
236
     private void saveInitialTouchY(MotionEvent event) {
235
         totalCollapse = 0;
237
         totalCollapse = 0;
238
+        totalCollapseDeltaSinceTouchDown = 0;
236
         touchDownY = event.getRawY();
239
         touchDownY = event.getRawY();
237
         scrollY = scrollView.getScrollY();
240
         scrollY = scrollView.getScrollY();
238
         previousCollapseY = touchDownY;
241
         previousCollapseY = touchDownY;