Browse Source

animation

Daniel Zlotin 8 years ago
parent
commit
2f70431203

+ 104
- 0
android/app/src/main/java/com/reactnativenavigation/animation/HideOnScrollAnimator.java View File

@@ -0,0 +1,104 @@
1
+package com.reactnativenavigation.animation;
2
+
3
+import android.animation.Animator;
4
+import android.animation.AnimatorListenerAdapter;
5
+import android.animation.ObjectAnimator;
6
+import android.support.annotation.NonNull;
7
+import android.support.v4.view.animation.LinearOutSlowInInterpolator;
8
+import android.view.View;
9
+
10
+import com.reactnativenavigation.views.ScrollDirectionListener;
11
+
12
+public class HideOnScrollAnimator {
13
+
14
+    public enum HideDirection {
15
+        Up, Down
16
+    }
17
+
18
+    private enum State {
19
+        Hidden, AnimateHide, Shown, AnimateShow
20
+    }
21
+
22
+    private static final int DURATION = 300;
23
+    private final View view;
24
+    private final HideDirection hideDirection;
25
+    private final int hiddenEndValue;
26
+    private final int shownEndValue = 0;
27
+    private State state = State.Shown;
28
+
29
+    public HideOnScrollAnimator(View view, HideDirection hideDirection, int height) {
30
+        this.view = view;
31
+        this.hideDirection = hideDirection;
32
+        this.hiddenEndValue = hideDirection == HideDirection.Up ? -height : height;
33
+    }
34
+
35
+    public void onScrollChanged(ScrollDirectionListener.Direction scrollDirection) {
36
+        if (hideDirection == HideDirection.Down) {
37
+            handleDownHidingViews(scrollDirection); //TODO better name
38
+        } else {
39
+            handleUpHidingViews(scrollDirection);
40
+        }
41
+    }
42
+
43
+    public void show() {
44
+        ObjectAnimator animator = createAnimator(true);
45
+        animator.start();
46
+    }
47
+
48
+    public void hide() {
49
+        ObjectAnimator animator = createAnimator(false);
50
+        animator.start();
51
+    }
52
+
53
+    private void handleUpHidingViews(ScrollDirectionListener.Direction scrollDirection) {
54
+        if (scrollUp(scrollDirection) && !hiding()) {
55
+            hide();
56
+        } else if (scrollDown(scrollDirection) && !showing()) {
57
+            show();
58
+        }
59
+    }
60
+
61
+    private void handleDownHidingViews(ScrollDirectionListener.Direction scrollDirection) {
62
+        if (scrollDown(scrollDirection) && !hiding()) {
63
+            hide();
64
+        } else if (scrollUp(scrollDirection) && !showing()) {
65
+            show();
66
+        }
67
+    }
68
+
69
+    private boolean scrollUp(ScrollDirectionListener.Direction scrollDirection) {
70
+        return scrollDirection == ScrollDirectionListener.Direction.Up;
71
+    }
72
+
73
+    private boolean scrollDown(ScrollDirectionListener.Direction scrollDirection) {
74
+        return scrollDirection == ScrollDirectionListener.Direction.Down;
75
+    }
76
+
77
+    private boolean showing() {
78
+        return state == State.Shown || state == State.AnimateShow;
79
+    }
80
+
81
+    private boolean hiding() {
82
+        return state == State.Hidden || state == State.AnimateHide;
83
+    }
84
+
85
+    @NonNull
86
+    private ObjectAnimator createAnimator(final boolean show) {
87
+        ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, show ? shownEndValue : hiddenEndValue);
88
+        animator.setDuration(DURATION);
89
+        animator.setInterpolator(new LinearOutSlowInInterpolator());
90
+        animator.addListener(new AnimatorListenerAdapter() {
91
+            @Override
92
+            public void onAnimationStart(Animator animation) {
93
+                state = show ? State.AnimateShow : State.AnimateHide;
94
+            }
95
+
96
+            @Override
97
+            public void onAnimationEnd(Animator animation) {
98
+                state = show ? State.Shown : State.Hidden;
99
+            }
100
+        });
101
+        return animator;
102
+    }
103
+
104
+}

+ 7
- 6
android/app/src/main/java/com/reactnativenavigation/core/Button.java View File

@@ -1,6 +1,5 @@
1 1
 package com.reactnativenavigation.core;
2 2
 
3
-import android.app.Activity;
4 3
 import android.graphics.drawable.Drawable;
5 4
 import android.support.annotation.ColorInt;
6 5
 import android.support.annotation.NonNull;
@@ -24,6 +23,7 @@ public class Button {
24 23
             WithText(MenuItem.SHOW_AS_ACTION_WITH_TEXT);
25 24
 
26 25
             int action;
26
+
27 27
             ShowAsAction(int action) {
28 28
                 this.action = action;
29 29
             }
@@ -35,15 +35,14 @@ public class Button {
35 35
         @ColorInt
36 36
         int color;
37 37
         ShowAsAction showAsAction;
38
+        boolean enabled = true;
38 39
     }
39 40
 
40
-    private final Activity activity;
41 41
     private final Menu menu;
42 42
     private final ActionMenuView parent;
43 43
     private Params buttonParams;
44 44
 
45
-    public Button(Activity activity, Menu menu, ActionMenuView parent, Params buttonParams) {
46
-        this.activity = activity;
45
+    public Button(Menu menu, ActionMenuView parent, Params buttonParams) {
47 46
         this.menu = menu;
48 47
         this.parent = parent;
49 48
         this.buttonParams = buttonParams;
@@ -52,11 +51,13 @@ public class Button {
52 51
     public MenuItem addToMenu(int index) {
53 52
         MenuItem item = menu.add(Menu.NONE, Menu.NONE, index, buttonParams.label);
54 53
         item.setShowAsAction(buttonParams.showAsAction.action);
54
+        item.setEnabled(buttonParams.enabled);
55 55
         setIcon(item);
56 56
         setColor();
57 57
         return item;
58 58
     }
59 59
 
60
+
60 61
     private void setIcon(MenuItem item) {
61 62
         if (hasIcon()) {
62 63
             item.setIcon(buttonParams.icon);
@@ -84,7 +85,7 @@ public class Button {
84 85
             @Override
85 86
             public void run() {
86 87
                 ArrayList<View> outViews = findActualTextViewInMenuByLabel();
87
-                setTextColorInternal(outViews);
88
+                setTextColorForFoundButtonViews(outViews);
88 89
             }
89 90
         });
90 91
     }
@@ -96,7 +97,7 @@ public class Button {
96 97
         return outViews;
97 98
     }
98 99
 
99
-    private void setTextColorInternal(ArrayList<View> outViews) {
100
+    private void setTextColorForFoundButtonViews(ArrayList<View> outViews) {
100 101
         for (View button : outViews) {
101 102
             ((TextView) button).setTextColor(buttonParams.color);
102 103
         }

+ 14
- 4
android/app/src/main/java/com/reactnativenavigation/views/TitleBar.java View File

@@ -16,6 +16,7 @@ public class TitleBar extends Toolbar {
16 16
 
17 17
     private Menu menu;
18 18
     private ActionMenuView actionMenuView;
19
+    private boolean hideOnScroll = false;
19 20
 
20 21
     public TitleBar(Context context) {
21 22
         super(context);
@@ -34,12 +35,21 @@ public class TitleBar extends Toolbar {
34 35
     public void setButtons(List<Button.Params> buttons) {
35 36
         menu.clear();
36 37
 
37
-        Activity context = (Activity) getContext();
38 38
         for (int i = 0; i < buttons.size(); i++) {
39
-            final Button button = new Button(context, buttons.get(i));
40
-            // Add button in reverse order because in iOS, index 0 starts at right
39
+            final Button button = new Button(menu, actionMenuView, buttons.get(i));
40
+            // Add button in reverse order because in iOS index 0 starts at right
41 41
             final int index = buttons.size() - i - 1;
42
-            button.addToMenu(context, menu, index);
42
+            button.addToMenu(index);
43
+        }
44
+    }
45
+
46
+    public void setHideOnScroll(boolean hideOnScroll) {
47
+        this.hideOnScroll = hideOnScroll;
48
+    }
49
+
50
+    public void onScrollChanged(ScrollDirectionListener.Direction direction) {
51
+        if (hideOnScroll) {
52
+            //TODO animate hide/show
43 53
         }
44 54
     }
45 55
 }