Browse Source

Default screen animation (#2120)

* Support showing modals with the default screen push/pop animation

* Set navigation bar color before modal is displayed

* Implement screenAnimationType property

controls animation type of all screens including modals.
Guy Carmeli 6 years ago
parent
commit
20f6944157
No account linked to committer's email address

+ 6
- 0
android/app/src/main/java/com/reactnativenavigation/controllers/Modal.java View File

24
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
24
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
25
 import com.reactnativenavigation.params.parsers.ModalAnimationFactory;
25
 import com.reactnativenavigation.params.parsers.ModalAnimationFactory;
26
 import com.reactnativenavigation.screens.NavigationType;
26
 import com.reactnativenavigation.screens.NavigationType;
27
+import com.reactnativenavigation.utils.NavigationBar;
27
 import com.reactnativenavigation.utils.StatusBar;
28
 import com.reactnativenavigation.utils.StatusBar;
28
 
29
 
29
 import java.util.List;
30
 import java.util.List;
115
         createContent();
116
         createContent();
116
         setAnimation(screenParams);
117
         setAnimation(screenParams);
117
         setStatusBarStyle(screenParams.styleParams);
118
         setStatusBarStyle(screenParams.styleParams);
119
+        setNavigationBarStyle(screenParams.styleParams);
118
     }
120
     }
119
 
121
 
120
     private void setStatusBarStyle(StyleParams styleParams) {
122
     private void setStatusBarStyle(StyleParams styleParams) {
124
         StatusBar.setTextColorScheme(window.getDecorView(), styleParams.statusBarTextColorScheme);
126
         StatusBar.setTextColorScheme(window.getDecorView(), styleParams.statusBarTextColorScheme);
125
     }
127
     }
126
 
128
 
129
+    private void setNavigationBarStyle(StyleParams styleParams) {
130
+        NavigationBar.setColor(getWindow(), styleParams.navigationBarColor);
131
+    }
132
+
127
     public AppCompatActivity getActivity() {
133
     public AppCompatActivity getActivity() {
128
         return activity;
134
         return activity;
129
     }
135
     }

+ 1
- 0
android/app/src/main/java/com/reactnativenavigation/params/StyleParams.java View File

80
     }
80
     }
81
 
81
 
82
     public Orientation orientation;
82
     public Orientation orientation;
83
+    public String screenAnimationType;
83
     public StatusBarTextColorScheme statusBarTextColorScheme;
84
     public StatusBarTextColorScheme statusBarTextColorScheme;
84
     public Color statusBarColor;
85
     public Color statusBarColor;
85
     public boolean statusBarHidden;
86
     public boolean statusBarHidden;

+ 2
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/ModalAnimationFactory.java View File

11
                 return R.style.ModalFadeAnimation;
11
                 return R.style.ModalFadeAnimation;
12
             case "slide-horizontal":
12
             case "slide-horizontal":
13
                 return R.style.ModalSlideHorizontal;
13
                 return R.style.ModalSlideHorizontal;
14
+            case "screen":
15
+                return R.style.ModalScreenAnimations;
14
             default:
16
             default:
15
                 return R.style.ModalDefaultAnimations;
17
                 return R.style.ModalDefaultAnimations;
16
         }
18
         }

+ 2
- 1
android/app/src/main/java/com/reactnativenavigation/params/parsers/ScreenParamsParser.java View File

3
 import android.graphics.drawable.Drawable;
3
 import android.graphics.drawable.Drawable;
4
 import android.os.Bundle;
4
 import android.os.Bundle;
5
 
5
 
6
+import com.reactnativenavigation.params.AppStyle;
6
 import com.reactnativenavigation.params.NavigationParams;
7
 import com.reactnativenavigation.params.NavigationParams;
7
 import com.reactnativenavigation.params.PageParams;
8
 import com.reactnativenavigation.params.PageParams;
8
 import com.reactnativenavigation.params.ScreenParams;
9
 import com.reactnativenavigation.params.ScreenParams;
55
         result.animateScreenTransitions = new AnimationParser(params).parse();
56
         result.animateScreenTransitions = new AnimationParser(params).parse();
56
         result.sharedElementsTransitions = getSharedElementsTransitions(params);
57
         result.sharedElementsTransitions = getSharedElementsTransitions(params);
57
 
58
 
58
-        result.animationType = params.getString(ANIMATION_TYPE, "slide-up");
59
+        result.animationType = params.getString(ANIMATION_TYPE, AppStyle.appStyle.screenAnimationType);
59
 
60
 
60
         return result;
61
         return result;
61
     }
62
     }

+ 7
- 2
android/app/src/main/java/com/reactnativenavigation/params/parsers/StyleParamsParser.java View File

28
 
28
 
29
         StyleParams result = new StyleParams(params);
29
         StyleParams result = new StyleParams(params);
30
         result.orientation = Orientation.fromString(params.getString("orientation", getDefaultOrientation()));
30
         result.orientation = Orientation.fromString(params.getString("orientation", getDefaultOrientation()));
31
+        result.screenAnimationType = params.getString("screenAnimationType", getDefaultScreenAnimationType());
31
         result.statusBarColor = getColor("statusBarColor", getDefaultStatusBarColor());
32
         result.statusBarColor = getColor("statusBarColor", getDefaultStatusBarColor());
32
         result.statusBarHidden = getBoolean("statusBarHidden", getDefaultStatusHidden());
33
         result.statusBarHidden = getBoolean("statusBarHidden", getDefaultStatusHidden());
33
         result.statusBarTextColorScheme = StatusBarTextColorScheme.fromString(params.getString("statusBarTextColorScheme"), getDefaultStatusBarTextColorScheme());
34
         result.statusBarTextColorScheme = StatusBarTextColorScheme.fromString(params.getString("statusBarTextColorScheme"), getDefaultStatusBarTextColorScheme());
89
         result.bottomTabsHiddenOnScroll = getBoolean("bottomTabsHiddenOnScroll", getDefaultBottomTabsHiddenOnScroll());
90
         result.bottomTabsHiddenOnScroll = getBoolean("bottomTabsHiddenOnScroll", getDefaultBottomTabsHiddenOnScroll());
90
         result.bottomTabsColor = getColor("bottomTabsColor", getDefaultBottomTabsColor());
91
         result.bottomTabsColor = getColor("bottomTabsColor", getDefaultBottomTabsColor());
91
         result.bottomTabsButtonColor = getColor("bottomTabsButtonColor", getDefaultBottomTabsButtonColor());
92
         result.bottomTabsButtonColor = getColor("bottomTabsButtonColor", getDefaultBottomTabsButtonColor());
92
-        result.selectedBottomTabsButtonColor =
93
-                getColor("bottomTabsSelectedButtonColor", getDefaultSelectedBottomTabsButtonColor());
93
+        result.selectedBottomTabsButtonColor = getColor("bottomTabsSelectedButtonColor", getDefaultSelectedBottomTabsButtonColor());
94
         result.bottomTabBadgeTextColor = getColor("bottomTabBadgeTextColor", getBottomTabBadgeTextColor());
94
         result.bottomTabBadgeTextColor = getColor("bottomTabBadgeTextColor", getBottomTabBadgeTextColor());
95
         result.bottomTabBadgeBackgroundColor = getColor("bottomTabBadgeBackgroundColor", getBottomTabBadgeBackgroundColor());
95
         result.bottomTabBadgeBackgroundColor = getColor("bottomTabBadgeBackgroundColor", getBottomTabBadgeBackgroundColor());
96
 
96
 
102
         return result;
102
         return result;
103
     }
103
     }
104
 
104
 
105
+    private String getDefaultScreenAnimationType() {
106
+        return AppStyle.appStyle == null ? "slide-up" : AppStyle.appStyle.screenAnimationType;
107
+    }
108
+
105
     private StatusBarTextColorScheme getDefaultStatusBarTextColorScheme() {
109
     private StatusBarTextColorScheme getDefaultStatusBarTextColorScheme() {
106
         return AppStyle.appStyle == null ? StatusBarTextColorScheme.Undefined : AppStyle.appStyle.statusBarTextColorScheme;
110
         return AppStyle.appStyle == null ? StatusBarTextColorScheme.Undefined : AppStyle.appStyle.statusBarTextColorScheme;
107
     }
111
     }
121
         result.titleBarSubtitleFontFamily = new StyleParams.Font();
125
         result.titleBarSubtitleFontFamily = new StyleParams.Font();
122
         result.titleBarButtonFontFamily = new StyleParams.Font();
126
         result.titleBarButtonFontFamily = new StyleParams.Font();
123
         result.titleBarHeight = -1;
127
         result.titleBarHeight = -1;
128
+        result.screenAnimationType = "slide-up";
124
         return result;
129
         return result;
125
     }
130
     }
126
 
131
 

+ 2
- 13
android/app/src/main/java/com/reactnativenavigation/screens/Screen.java View File

1
 package com.reactnativenavigation.screens;
1
 package com.reactnativenavigation.screens;
2
 
2
 
3
 import android.animation.LayoutTransition;
3
 import android.animation.LayoutTransition;
4
-import android.annotation.TargetApi;
5
 import android.content.res.Configuration;
4
 import android.content.res.Configuration;
6
-import android.graphics.Color;
7
-import android.os.Build;
8
 import android.os.Bundle;
5
 import android.os.Bundle;
9
 import android.support.v7.app.AppCompatActivity;
6
 import android.support.v7.app.AppCompatActivity;
10
-import android.view.Window;
11
 import android.widget.RelativeLayout;
7
 import android.widget.RelativeLayout;
12
 
8
 
13
 import com.facebook.react.bridge.Callback;
9
 import com.facebook.react.bridge.Callback;
28
 import com.reactnativenavigation.params.TitleBarButtonParams;
24
 import com.reactnativenavigation.params.TitleBarButtonParams;
29
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
25
 import com.reactnativenavigation.params.TitleBarLeftButtonParams;
30
 import com.reactnativenavigation.params.parsers.StyleParamsParser;
26
 import com.reactnativenavigation.params.parsers.StyleParamsParser;
27
+import com.reactnativenavigation.utils.NavigationBar;
31
 import com.reactnativenavigation.utils.StatusBar;
28
 import com.reactnativenavigation.utils.StatusBar;
32
 import com.reactnativenavigation.views.ContentView;
29
 import com.reactnativenavigation.views.ContentView;
33
 import com.reactnativenavigation.views.LeftButtonOnClickListener;
30
 import com.reactnativenavigation.views.LeftButtonOnClickListener;
181
         StatusBar.setTextColorScheme(this, textColorScheme);
178
         StatusBar.setTextColorScheme(this, textColorScheme);
182
     }
179
     }
183
 
180
 
184
-    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
185
     public void setNavigationBarColor(StyleParams.Color navigationBarColor) {
181
     public void setNavigationBarColor(StyleParams.Color navigationBarColor) {
186
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
187
-
188
-        final Window window = ((NavigationActivity) activity).getScreenWindow();
189
-        if (navigationBarColor.hasColor()) {
190
-            window.setNavigationBarColor(navigationBarColor.getColor());
191
-        } else {
192
-            window.setNavigationBarColor(Color.BLACK);
193
-        }
182
+        NavigationBar.setColor(((NavigationActivity) activity).getScreenWindow(), navigationBarColor);
194
     }
183
     }
195
 
184
 
196
     public abstract void unmountReactView();
185
     public abstract void unmountReactView();

+ 0
- 2
android/app/src/main/java/com/reactnativenavigation/screens/ScreenAnimator.java View File

8
 import android.view.animation.AccelerateDecelerateInterpolator;
8
 import android.view.animation.AccelerateDecelerateInterpolator;
9
 import android.view.animation.AccelerateInterpolator;
9
 import android.view.animation.AccelerateInterpolator;
10
 import android.view.animation.DecelerateInterpolator;
10
 import android.view.animation.DecelerateInterpolator;
11
-import android.view.animation.LinearInterpolator;
12
 
11
 
13
 import com.reactnativenavigation.NavigationApplication;
12
 import com.reactnativenavigation.NavigationApplication;
14
 import com.reactnativenavigation.utils.ViewUtils;
13
 import com.reactnativenavigation.utils.ViewUtils;
23
     private static final int DURATION = 250;
22
     private static final int DURATION = 250;
24
     private static final int ALPHA_START_DELAY = 100;
23
     private static final int ALPHA_START_DELAY = 100;
25
     private static final int ALPHA_SHORT_DURATION = 150;
24
     private static final int ALPHA_SHORT_DURATION = 150;
26
-    private static final LinearInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
27
     private static final DecelerateInterpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator();
25
     private static final DecelerateInterpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator();
28
     private static final AccelerateDecelerateInterpolator ACCELERATE_DECELERATE_INTERPOLATOR = new AccelerateDecelerateInterpolator();
26
     private static final AccelerateDecelerateInterpolator ACCELERATE_DECELERATE_INTERPOLATOR = new AccelerateDecelerateInterpolator();
29
     private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator();
27
     private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator();

+ 22
- 0
android/app/src/main/java/com/reactnativenavigation/utils/NavigationBar.java View File

1
+package com.reactnativenavigation.utils;
2
+
3
+import android.annotation.TargetApi;
4
+import android.graphics.Color;
5
+import android.os.Build;
6
+import android.view.Window;
7
+
8
+import com.reactnativenavigation.params.StyleParams;
9
+
10
+
11
+public class NavigationBar {
12
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
13
+    public static void setColor(Window window, StyleParams.Color navigationBarColor) {
14
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || window == null) return;
15
+//        final Window window = ((NavigationActivity) activity).getScreenWindow();
16
+        if (navigationBarColor.hasColor()) {
17
+            window.setNavigationBarColor(navigationBarColor.getColor());
18
+        } else {
19
+            window.setNavigationBarColor(Color.BLACK);
20
+        }
21
+    }
22
+}

+ 14
- 0
android/app/src/main/res/anim/pop.xml View File

1
+<?xml version="1.0" encoding="utf-8"?>
2
+<set xmlns:android="http://schemas.android.com/apk/res/android"
3
+     android:interpolator="@android:anim/accelerate_interpolator"
4
+     android:shareInterpolator="true">
5
+    <translate
6
+        android:duration="250"
7
+        android:fromYDelta="0%"
8
+        android:toYDelta="8%"/>
9
+    <alpha
10
+        android:startOffset="100"
11
+        android:duration="150"
12
+        android:fromAlpha="1"
13
+        android:toAlpha="0"/>
14
+</set>

+ 4
- 0
android/app/src/main/res/values/styles.xml View File

26
     <style name="ModalSlideHorizontal">
26
     <style name="ModalSlideHorizontal">
27
         <item name="android:windowExitAnimation">@anim/slide_out_right</item>
27
         <item name="android:windowExitAnimation">@anim/slide_out_right</item>
28
     </style>
28
     </style>
29
+
30
+    <style name="ModalScreenAnimations">
31
+        <item name="android:windowExitAnimation">@anim/pop</item>
32
+    </style>
29
 </resources>
33
 </resources>

+ 1
- 0
src/deprecated/platformSpecificDeprecated.android.js View File

138
 
138
 
139
   let ret = {
139
   let ret = {
140
     orientation: originalStyleObject.orientation,
140
     orientation: originalStyleObject.orientation,
141
+    screenAnimationType: originalStyleObject.screenAnimationType,
141
     statusBarColor: processColor(originalStyleObject.statusBarColor),
142
     statusBarColor: processColor(originalStyleObject.statusBarColor),
142
     statusBarHidden: originalStyleObject.statusBarHidden,
143
     statusBarHidden: originalStyleObject.statusBarHidden,
143
     statusBarTextColorScheme: originalStyleObject.statusBarTextColorScheme,
144
     statusBarTextColorScheme: originalStyleObject.statusBarTextColorScheme,