Просмотр исходного кода

Show and hide title when collapsing or expending header

Guy Carmeli 8 лет назад
Родитель
Сommit
0f8c842226

+ 14
- 5
android/app/src/main/java/com/reactnativenavigation/views/collapsingToolbar/CollapsingTopBar.java Просмотреть файл

@@ -73,12 +73,9 @@ public class CollapsingTopBar extends TopBar implements CollapsingView {
73 73
             LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, (int) CollapsingTopBarBackground.MAX_HEIGHT);
74 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 79
         if (params.hasReactView()) {
83 80
             header = new CollapsingTopBarReactHeader(getContext(),
84 81
                     params,
@@ -86,13 +83,25 @@ public class CollapsingTopBar extends TopBar implements CollapsingView {
86 83
                     scrollListener);
87 84
             LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, (int) ViewUtils.convertDpToPixel(params.reactViewHeight));
88 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 101
     @Override
93 102
     protected TitleBar createTitleBar() {
94 103
         if (params.hasBackgroundImage() || params.hasReactView()) {
95
-            createReactView(params);
104
+            createReactHeader(params);
96 105
             return new CollapsingTitleBar(getContext(),
97 106
                     getCollapsedHeight(),
98 107
                     scrollListener,

+ 30
- 4
android/app/src/main/java/com/reactnativenavigation/views/collapsingToolbar/CollapsingTopBarReactHeader.java Просмотреть файл

@@ -15,25 +15,37 @@ import com.reactnativenavigation.params.NavigationParams;
15 15
 import com.reactnativenavigation.utils.ViewUtils;
16 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 19
     private ScrollListener listener;
20 20
     private boolean mIsScrolling;
21 21
     private int mTouchSlop;
22 22
     private int touchDown = -1;
23 23
     private final JSTouchDispatcher mJSTouchDispatcher = new JSTouchDispatcher(this);
24 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 36
     public CollapsingTopBarReactHeader(Context context, CollapsingTopBarParams params, NavigationParams navigationParams, ScrollListener scrollListener) {
27 37
         super(context, params.reactViewId, navigationParams);
28 38
         listener = scrollListener;
29 39
         ViewConfiguration vc = ViewConfiguration.get(context);
30 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 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 51
     public void collapse(float amount) {
@@ -108,4 +120,18 @@ public class CollapsingTopBarReactHeader extends ContentView {
108 120
         EventDispatcher eventDispatcher = reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
109 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 Просмотреть файл

@@ -6,7 +6,13 @@ import android.view.animation.Interpolator;
6 6
 import static com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBarReactHeaderAnimator.State.Invisible;
7 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 16
     enum State {Visible, Invisible}
11 17
 
12 18
     private State state = Invisible;
@@ -15,8 +21,18 @@ public class CollapsingTopBarReactHeaderAnimator {
15 21
     private float showThreshold;
16 22
     private final static int ANIMATION_DURATION = 360;
17 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 36
         this.header = header;
21 37
         this.hideThreshold = hideThreshold;
22 38
         this.showThreshold = showThreshold;
@@ -39,6 +55,9 @@ public class CollapsingTopBarReactHeaderAnimator {
39 55
     }
40 56
 
41 57
     private void show() {
58
+        if (state == Invisible && onVisibleListener != null) {
59
+            onVisibleListener.onVisible();
60
+        }
42 61
         state = State.Visible;
43 62
         header.animate()
44 63
                 .alpha(1)
@@ -47,6 +66,9 @@ public class CollapsingTopBarReactHeaderAnimator {
47 66
     }
48 67
 
49 68
     private void hide() {
69
+        if (state == Visible && onHiddenListener != null) {
70
+            onHiddenListener.onHidden();
71
+        }
50 72
         state = State.Invisible;
51 73
         header.animate()
52 74
                 .alpha(0)