Browse Source

Show and hide title when collapsing or expending header

Guy Carmeli 8 years ago
parent
commit
0f8c842226

+ 14
- 5
android/app/src/main/java/com/reactnativenavigation/views/collapsingToolbar/CollapsingTopBar.java View File

73
             LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, (int) CollapsingTopBarBackground.MAX_HEIGHT);
73
             LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, (int) CollapsingTopBarBackground.MAX_HEIGHT);
74
             titleBarAndContextualMenuContainer.addView(collapsingTopBarBackground, lp);
74
             titleBarAndContextualMenuContainer.addView(collapsingTopBarBackground, lp);
75
         }
75
         }
76
-        if (params.hasReactView()) {
77
-
78
-        }
79
     }
76
     }
80
 
77
 
81
-    private void createReactView(CollapsingTopBarParams params) {
78
+    private void createReactHeader(CollapsingTopBarParams params) {
82
         if (params.hasReactView()) {
79
         if (params.hasReactView()) {
83
             header = new CollapsingTopBarReactHeader(getContext(),
80
             header = new CollapsingTopBarReactHeader(getContext(),
84
                     params,
81
                     params,
86
                     scrollListener);
83
                     scrollListener);
87
             LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, (int) ViewUtils.convertDpToPixel(params.reactViewHeight));
84
             LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, (int) ViewUtils.convertDpToPixel(params.reactViewHeight));
88
             titleBarAndContextualMenuContainer.addView(header, lp);
85
             titleBarAndContextualMenuContainer.addView(header, lp);
86
+            header.setOnHiddenListener(new CollapsingTopBarReactHeaderAnimator.OnHiddenListener() {
87
+                @Override
88
+                public void onHidden() {
89
+                    titleBar.setTitle(title);
90
+                }
91
+            });
92
+            header.setOnVisibleListener(new CollapsingTopBarReactHeaderAnimator.OnVisibleListener() {
93
+                @Override
94
+                public void onVisible() {
95
+                    titleBar.setTitle("");
96
+                }
97
+            });
89
         }
98
         }
90
     }
99
     }
91
 
100
 
92
     @Override
101
     @Override
93
     protected TitleBar createTitleBar() {
102
     protected TitleBar createTitleBar() {
94
         if (params.hasBackgroundImage() || params.hasReactView()) {
103
         if (params.hasBackgroundImage() || params.hasReactView()) {
95
-            createReactView(params);
104
+            createReactHeader(params);
96
             return new CollapsingTitleBar(getContext(),
105
             return new CollapsingTitleBar(getContext(),
97
                     getCollapsedHeight(),
106
                     getCollapsedHeight(),
98
                     scrollListener,
107
                     scrollListener,

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

15
 import com.reactnativenavigation.utils.ViewUtils;
15
 import com.reactnativenavigation.utils.ViewUtils;
16
 import com.reactnativenavigation.views.ContentView;
16
 import com.reactnativenavigation.views.ContentView;
17
 
17
 
18
-public class CollapsingTopBarReactHeader extends ContentView {
18
+public class CollapsingTopBarReactHeader extends ContentView implements CollapsingTopBarReactHeaderAnimator.OnVisibleListener, CollapsingTopBarReactHeaderAnimator.OnHiddenListener {
19
     private ScrollListener listener;
19
     private ScrollListener listener;
20
     private boolean mIsScrolling;
20
     private boolean mIsScrolling;
21
     private int mTouchSlop;
21
     private int mTouchSlop;
22
     private int touchDown = -1;
22
     private int touchDown = -1;
23
     private final JSTouchDispatcher mJSTouchDispatcher = new JSTouchDispatcher(this);
23
     private final JSTouchDispatcher mJSTouchDispatcher = new JSTouchDispatcher(this);
24
     private CollapsingTopBarReactHeaderAnimator visibilityAnimator;
24
     private CollapsingTopBarReactHeaderAnimator visibilityAnimator;
25
+    private CollapsingTopBarReactHeaderAnimator.OnVisibleListener onVisibleListener;
26
+    private CollapsingTopBarReactHeaderAnimator.OnHiddenListener onHiddenListener;
27
+
28
+    public void setOnVisibleListener(CollapsingTopBarReactHeaderAnimator.OnVisibleListener onVisibleListener) {
29
+        this.onVisibleListener = onVisibleListener;
30
+    }
31
+
32
+    public void setOnHiddenListener(CollapsingTopBarReactHeaderAnimator.OnHiddenListener onHiddenListener) {
33
+        this.onHiddenListener = onHiddenListener;
34
+    }
25
 
35
 
26
     public CollapsingTopBarReactHeader(Context context, CollapsingTopBarParams params, NavigationParams navigationParams, ScrollListener scrollListener) {
36
     public CollapsingTopBarReactHeader(Context context, CollapsingTopBarParams params, NavigationParams navigationParams, ScrollListener scrollListener) {
27
         super(context, params.reactViewId, navigationParams);
37
         super(context, params.reactViewId, navigationParams);
28
         listener = scrollListener;
38
         listener = scrollListener;
29
         ViewConfiguration vc = ViewConfiguration.get(context);
39
         ViewConfiguration vc = ViewConfiguration.get(context);
30
         mTouchSlop = vc.getScaledTouchSlop();
40
         mTouchSlop = vc.getScaledTouchSlop();
31
-        visibilityAnimator = createVisibilityAnimator(params.reactViewHeight);
41
+        createVisibilityAnimator(params.reactViewHeight);
32
     }
42
     }
33
 
43
 
34
-    private CollapsingTopBarReactHeaderAnimator createVisibilityAnimator(int reactViewHeight) {
44
+    private void createVisibilityAnimator(int reactViewHeight) {
35
         float height = ViewUtils.convertDpToPixel(reactViewHeight);
45
         float height = ViewUtils.convertDpToPixel(reactViewHeight);
36
-        return new CollapsingTopBarReactHeaderAnimator(this, height / 2, height / 2);
46
+        visibilityAnimator = new CollapsingTopBarReactHeaderAnimator(this, height / 2, height / 2);
47
+        visibilityAnimator.setOnHiddenListener(this);
48
+        visibilityAnimator.setOnVisibleListener(this);
37
     }
49
     }
38
 
50
 
39
     public void collapse(float amount) {
51
     public void collapse(float amount) {
108
         EventDispatcher eventDispatcher = reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
120
         EventDispatcher eventDispatcher = reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
109
         mJSTouchDispatcher.handleTouchEvent(event, eventDispatcher);
121
         mJSTouchDispatcher.handleTouchEvent(event, eventDispatcher);
110
     }
122
     }
123
+
124
+    @Override
125
+    public void onVisible() {
126
+        if (onVisibleListener != null) {
127
+            onVisibleListener.onVisible();
128
+        }
129
+    }
130
+
131
+    @Override
132
+    public void onHidden() {
133
+        if (onHiddenListener != null) {
134
+            onHiddenListener.onHidden();
135
+        }
136
+    }
111
 }
137
 }

+ 24
- 2
android/app/src/main/java/com/reactnativenavigation/views/collapsingToolbar/CollapsingTopBarReactHeaderAnimator.java View File

6
 import static com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBarReactHeaderAnimator.State.Invisible;
6
 import static com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBarReactHeaderAnimator.State.Invisible;
7
 import static com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBarReactHeaderAnimator.State.Visible;
7
 import static com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBarReactHeaderAnimator.State.Visible;
8
 
8
 
9
-public class CollapsingTopBarReactHeaderAnimator {
9
+class CollapsingTopBarReactHeaderAnimator {
10
+    interface OnVisibleListener {
11
+        void onVisible();
12
+    }
13
+    interface OnHiddenListener {
14
+        void onHidden();
15
+    }
10
     enum State {Visible, Invisible}
16
     enum State {Visible, Invisible}
11
 
17
 
12
     private State state = Invisible;
18
     private State state = Invisible;
15
     private float showThreshold;
21
     private float showThreshold;
16
     private final static int ANIMATION_DURATION = 360;
22
     private final static int ANIMATION_DURATION = 360;
17
     private final Interpolator interpolator = new DecelerateInterpolator();
23
     private final Interpolator interpolator = new DecelerateInterpolator();
24
+    private OnVisibleListener onVisibleListener;
25
+    private OnHiddenListener onHiddenListener;
26
+
27
+    void setOnVisibleListener(OnVisibleListener onVisibleListener) {
28
+        this.onVisibleListener = onVisibleListener;
29
+    }
18
 
30
 
19
-    public CollapsingTopBarReactHeaderAnimator(CollapsingTopBarReactHeader header, float hideThreshold, float showThreshold) {
31
+    void setOnHiddenListener(OnHiddenListener onHiddenListener) {
32
+        this.onHiddenListener = onHiddenListener;
33
+    }
34
+
35
+    CollapsingTopBarReactHeaderAnimator(CollapsingTopBarReactHeader header, float hideThreshold, float showThreshold) {
20
         this.header = header;
36
         this.header = header;
21
         this.hideThreshold = hideThreshold;
37
         this.hideThreshold = hideThreshold;
22
         this.showThreshold = showThreshold;
38
         this.showThreshold = showThreshold;
39
     }
55
     }
40
 
56
 
41
     private void show() {
57
     private void show() {
58
+        if (state == Invisible && onVisibleListener != null) {
59
+            onVisibleListener.onVisible();
60
+        }
42
         state = State.Visible;
61
         state = State.Visible;
43
         header.animate()
62
         header.animate()
44
                 .alpha(1)
63
                 .alpha(1)
47
     }
66
     }
48
 
67
 
49
     private void hide() {
68
     private void hide() {
69
+        if (state == Visible && onHiddenListener != null) {
70
+            onHiddenListener.onHidden();
71
+        }
50
         state = State.Invisible;
72
         state = State.Invisible;
51
         header.animate()
73
         header.animate()
52
                 .alpha(0)
74
                 .alpha(0)