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

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

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

16
 
16
 
17
     private Menu menu;
17
     private Menu menu;
18
     private ActionMenuView actionMenuView;
18
     private ActionMenuView actionMenuView;
19
+    private boolean hideOnScroll = false;
19
 
20
 
20
     public TitleBar(Context context) {
21
     public TitleBar(Context context) {
21
         super(context);
22
         super(context);
34
     public void setButtons(List<Button.Params> buttons) {
35
     public void setButtons(List<Button.Params> buttons) {
35
         menu.clear();
36
         menu.clear();
36
 
37
 
37
-        Activity context = (Activity) getContext();
38
         for (int i = 0; i < buttons.size(); i++) {
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
             final int index = buttons.size() - i - 1;
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
 }