ソースを参照

Animate screen into place after hiding navBar (#2095)

Guy Carmeli 7 年 前
コミット
46fbde8a4c
No account linked to committer's email address

+ 19
- 8
android/app/src/main/java/com/reactnativenavigation/animation/VisibilityAnimator.java ファイルの表示

1
 package com.reactnativenavigation.animation;
1
 package com.reactnativenavigation.animation;
2
 
2
 
3
+import android.animation.Animator;
4
+import android.animation.AnimatorListenerAdapter;
3
 import android.animation.ObjectAnimator;
5
 import android.animation.ObjectAnimator;
6
+import android.support.annotation.Nullable;
4
 import android.support.v4.view.animation.LinearOutSlowInInterpolator;
7
 import android.support.v4.view.animation.LinearOutSlowInInterpolator;
5
 import android.view.View;
8
 import android.view.View;
6
 
9
 
24
         this.hiddenEndValue = hideDirection == HideDirection.Up ? -height : height;
27
         this.hiddenEndValue = hideDirection == HideDirection.Up ? -height : height;
25
     }
28
     }
26
 
29
 
27
-    public void setVisible(boolean visible, boolean animate) {
30
+    public void setVisible(boolean visible, boolean animate, @Nullable Runnable onAnimationEnd) {
28
         cancelAnimator();
31
         cancelAnimator();
29
         if (visible) {
32
         if (visible) {
30
-            show(animate);
33
+            show(animate, onAnimationEnd);
31
         } else {
34
         } else {
32
-            hide(animate);
35
+            hide(animate, onAnimationEnd);
33
         }
36
         }
34
     }
37
     }
35
 
38
 
40
         }
43
         }
41
     }
44
     }
42
 
45
 
43
-    private void show(boolean animate) {
46
+    private void show(boolean animate, @Nullable Runnable onAnimationEnd) {
44
         if (animate) {
47
         if (animate) {
45
-            animator = createAnimator(true);
48
+            animator = createAnimator(true, onAnimationEnd);
46
             animator.start();
49
             animator.start();
47
         } else {
50
         } else {
48
             view.setTranslationY(SHOW_END_VALUE);
51
             view.setTranslationY(SHOW_END_VALUE);
49
             view.setVisibility(View.VISIBLE);
52
             view.setVisibility(View.VISIBLE);
53
+            if (onAnimationEnd != null) onAnimationEnd.run();
50
         }
54
         }
51
     }
55
     }
52
 
56
 
53
-    private void hide(boolean animate) {
57
+    private void hide(boolean animate, @Nullable Runnable onAnimationEnd) {
54
         if (animate) {
58
         if (animate) {
55
-            animator = createAnimator(false);
59
+            animator = createAnimator(false, onAnimationEnd);
56
             animator.start();
60
             animator.start();
57
         } else {
61
         } else {
58
             view.setTranslationY(hiddenEndValue);
62
             view.setTranslationY(hiddenEndValue);
59
             view.setVisibility(View.GONE);
63
             view.setVisibility(View.GONE);
64
+            if (onAnimationEnd != null) onAnimationEnd.run();
60
         }
65
         }
61
     }
66
     }
62
 
67
 
63
-    private ObjectAnimator createAnimator(final boolean show) {
68
+    private ObjectAnimator createAnimator(final boolean show, @Nullable final Runnable onAnimationEnd) {
64
         view.setVisibility(View.VISIBLE);
69
         view.setVisibility(View.VISIBLE);
65
         final ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, show ? SHOW_END_VALUE : hiddenEndValue);
70
         final ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, show ? SHOW_END_VALUE : hiddenEndValue);
66
         animator.setDuration(DURATION);
71
         animator.setDuration(DURATION);
67
         animator.setInterpolator(interpolator);
72
         animator.setInterpolator(interpolator);
73
+        animator.addListener(new AnimatorListenerAdapter() {
74
+            @Override
75
+            public void onAnimationEnd(Animator animation) {
76
+                if (onAnimationEnd != null) onAnimationEnd.run();
77
+            }
78
+        });
68
         return animator;
79
         return animator;
69
     }
80
     }
70
 }
81
 }

+ 7
- 0
android/app/src/main/java/com/reactnativenavigation/screens/Screen.java ファイルの表示

1
 package com.reactnativenavigation.screens;
1
 package com.reactnativenavigation.screens;
2
 
2
 
3
+import android.animation.LayoutTransition;
3
 import android.annotation.TargetApi;
4
 import android.annotation.TargetApi;
4
 import android.content.res.Configuration;
5
 import android.content.res.Configuration;
5
 import android.graphics.Color;
6
 import android.graphics.Color;
239
 
240
 
240
     public void setTopBarVisible(boolean visible, boolean animate) {
241
     public void setTopBarVisible(boolean visible, boolean animate) {
241
         screenParams.styleParams.titleBarHidden = !visible;
242
         screenParams.styleParams.titleBarHidden = !visible;
243
+        if (animate && styleParams.drawScreenBelowTopBar) {
244
+            setLayoutTransition(new LayoutTransition());
245
+            getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
246
+        } else {
247
+            setLayoutTransition(null);
248
+        }
242
         topBar.setVisible(visible, animate);
249
         topBar.setVisible(visible, animate);
243
     }
250
     }
244
 
251
 

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/views/BottomTabs.java ファイルの表示

86
 
86
 
87
     public void setVisibility(boolean hidden, boolean animated) {
87
     public void setVisibility(boolean hidden, boolean animated) {
88
         if (visibilityAnimator != null) {
88
         if (visibilityAnimator != null) {
89
-            visibilityAnimator.setVisible(!hidden, animated);
89
+            visibilityAnimator.setVisible(!hidden, animated, null);
90
         } else {
90
         } else {
91
             setVisibility(hidden);
91
             setVisibility(hidden);
92
         }
92
         }

+ 11
- 2
android/app/src/main/java/com/reactnativenavigation/views/TopBar.java ファイルの表示

261
     }
261
     }
262
 
262
 
263
     public void setVisible(boolean visible, boolean animate) {
263
     public void setVisible(boolean visible, boolean animate) {
264
-        titleBar.setVisibility(!visible);
265
-        visibilityAnimator.setVisible(visible, animate);
264
+        if (visible) {
265
+            titleBar.setVisibility(false);
266
+            visibilityAnimator.setVisible(true, animate, null);
267
+        } else {
268
+            visibilityAnimator.setVisible(false, animate, new Runnable() {
269
+                @Override
270
+                public void run() {
271
+                    titleBar.setVisibility(true);
272
+                }
273
+            });
274
+        }
266
     }
275
     }
267
 }
276
 }