Quellcode durchsuchen

scroll direction listener

Daniel Zlotin vor 8 Jahren
Ursprung
Commit
e0b8a6abac

+ 12
- 2
android/app/src/main/java/com/reactnativenavigation/layouts/ScreenLayout.java Datei anzeigen

@@ -1,7 +1,17 @@
1 1
 package com.reactnativenavigation.layouts;
2 2
 
3
-import com.facebook.react.ReactRootView;
3
+import android.content.Context;
4
+import android.widget.LinearLayout;
4 5
 
5
-public class ScreenLayout extends ReactRootView {
6
+public class ScreenLayout extends LinearLayout {
6 7
 
8
+    public static class Params {
9
+
10
+    }
11
+
12
+    public ScreenLayout(Context context, Params params) {
13
+        super(context);
14
+        setOrientation(VERTICAL);
15
+        addView();
16
+    }
7 17
 }

+ 43
- 0
android/app/src/main/java/com/reactnativenavigation/views/ContentView.java Datei anzeigen

@@ -0,0 +1,43 @@
1
+package com.reactnativenavigation.views;
2
+
3
+import android.content.Context;
4
+import android.os.Bundle;
5
+import android.support.annotation.Nullable;
6
+import android.view.View;
7
+import android.view.ViewGroup;
8
+import android.widget.ScrollView;
9
+
10
+import com.facebook.react.ReactInstanceManager;
11
+import com.facebook.react.ReactRootView;
12
+
13
+public class ContentView extends ReactRootView {
14
+
15
+    public ContentView(Context context, ReactInstanceManager reactInstanceManager, String moduleName, Bundle passProps) {
16
+        super(context);
17
+        startReactApplication(reactInstanceManager, moduleName, passProps);
18
+    }
19
+
20
+    @Nullable
21
+    public ScrollView findScrollView() {
22
+        return findScrollView(this);
23
+    }
24
+
25
+    private ScrollView findScrollView(ViewGroup parent) {
26
+        for (int i = 0; i < parent.getChildCount(); i++) {
27
+            View child = parent.getChildAt(i);
28
+
29
+            if (child instanceof ScrollView) {
30
+                return (ScrollView) child;
31
+            } else if (child instanceof ViewGroup) {
32
+                return findScrollView((ViewGroup) child);
33
+            }
34
+        }
35
+
36
+        return null;
37
+    }
38
+
39
+    @Override
40
+    protected void onDetachedFromWindow() {
41
+        super.onDetachedFromWindow();
42
+    }
43
+}

+ 9
- 44
android/app/src/main/java/com/reactnativenavigation/views/RctView.java Datei anzeigen

@@ -23,26 +23,6 @@ public class RctView extends FrameLayout {
23 23
     private BottomTabActivity context;
24 24
     private ReactRootView reactRootView;
25 25
     private ScrollView scrollView;
26
-    private int lastScrollY = -1;
27
-    private final ViewTreeObserver.OnScrollChangedListener scrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() {
28
-        @Override
29
-        public void onScrollChanged() {
30
-            if (!scrollView.getViewTreeObserver().isAlive()) {
31
-                return;
32
-            }
33
-
34
-            final int scrollY = scrollView.getScrollY();
35
-            if (scrollY != lastScrollY && // Scroll position changed
36
-                scrollY > 0 && // Ignore top overscroll
37
-                scrollY < (scrollView.getChildAt(0).getHeight() - scrollView.getHeight())) { // Ignore bottom overscroll
38
-                int direction = scrollY > lastScrollY ?
39
-                        BottomNavigation.SCROLL_DIRECTION_DOWN :
40
-                        BottomNavigation.SCROLL_DIRECTION_UP;
41
-                lastScrollY = scrollY;
42
-                context.onScrollChanged(direction);
43
-            }
44
-        }
45
-    };
46 26
     private boolean isScrollEventListenerRegistered = false;
47 27
 
48 28
     private final View.OnAttachStateChangeListener stateChangeListener =
@@ -90,16 +70,16 @@ public class RctView extends FrameLayout {
90 70
         setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
91 71
 
92 72
         final OnDisplayedListener onDisplayedListenerInternal = screen.bottomTabsHiddenOnScroll ?
93
-            new OnDisplayedListener() {
94
-                @Override
95
-                public void onDisplayed() {
96
-                    if (onDisplayedListener != null) {
97
-                        onDisplayedListener.onDisplayed();
98
-                    }
73
+                new OnDisplayedListener() {
74
+                    @Override
75
+                    public void onDisplayed() {
76
+                        if (onDisplayedListener != null) {
77
+                            onDisplayedListener.onDisplayed();
78
+                        }
99 79
 
100
-                    setupScrollViewWithBottomTabs();
101
-                }
102
-            } : onDisplayedListener;
80
+                        setupScrollViewWithBottomTabs();
81
+                    }
82
+                } : onDisplayedListener;
103 83
 
104 84
         reactRootView = new RnnReactRootView(ctx, onDisplayedListenerInternal);
105 85
         reactRootView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
@@ -130,21 +110,6 @@ public class RctView extends FrameLayout {
130 110
         }
131 111
     }
132 112
 
133
-    private ScrollView getScrollView(ViewGroup parent) {
134
-        for (int i = 0; i < parent.getChildCount(); i++) {
135
-            View child = parent.getChildAt(i);
136
-
137
-            if (child instanceof ScrollView) {
138
-                return (ScrollView) child;
139
-            }
140
-
141
-            if (child instanceof ViewGroup) {
142
-                return getScrollView((ViewGroup) child);
143
-            }
144
-        }
145
-
146
-        return null;
147
-    }
148 113
 
149 114
     private void attachStateChangeListener(ScrollView scrollView) {
150 115
         scrollView.addOnAttachStateChangeListener(stateChangeListener);

+ 49
- 0
android/app/src/main/java/com/reactnativenavigation/views/ScrollDirectionListener.java Datei anzeigen

@@ -0,0 +1,49 @@
1
+package com.reactnativenavigation.views;
2
+
3
+import android.view.ViewGroup;
4
+import android.view.ViewTreeObserver;
5
+
6
+public class ScrollDirectionListener implements ViewTreeObserver.OnScrollChangedListener {
7
+    public enum Direction {
8
+        Up, Down
9
+    }
10
+
11
+    public interface OnChanged {
12
+        void onChanged(Direction direction);
13
+    }
14
+
15
+    private final ViewGroup view;
16
+    private final OnChanged onChanged;
17
+    private int lastScrollY = -1;
18
+
19
+    public ScrollDirectionListener(ViewGroup view, OnChanged onChanged) {
20
+        this.view = view;
21
+        this.onChanged = onChanged;
22
+    }
23
+
24
+    @Override
25
+    public void onScrollChanged() {
26
+        if (!view.getViewTreeObserver().isAlive()) {
27
+            return;
28
+        }
29
+
30
+        final int scrollY = view.getScrollY();
31
+        if (isScrollPositionChanged(scrollY) && !isTopOverscroll(scrollY) && !isBottomOverscroll(scrollY)) {
32
+            lastScrollY = scrollY;
33
+            onChanged.onChanged(scrollY > lastScrollY ? Direction.Down : Direction.Up);
34
+        }
35
+    }
36
+
37
+    private boolean isBottomOverscroll(int scrollY) {
38
+        return scrollY >= (view.getChildAt(0).getHeight() - view.getHeight());
39
+    }
40
+
41
+    private boolean isTopOverscroll(int scrollY) {
42
+        return scrollY <= 0;
43
+    }
44
+
45
+    private boolean isScrollPositionChanged(int scrollY) {
46
+        return scrollY != lastScrollY;
47
+    }
48
+
49
+}