react-native-navigation的迁移库

TopBar.java 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package com.reactnativenavigation.views;
  2. import android.content.Context;
  3. import android.graphics.Color;
  4. import android.os.Build;
  5. import android.support.annotation.NonNull;
  6. import android.support.annotation.Nullable;
  7. import android.support.design.widget.AppBarLayout;
  8. import android.support.v7.app.ActionBar;
  9. import android.view.Gravity;
  10. import android.view.ViewGroup;
  11. import android.widget.FrameLayout;
  12. import com.facebook.react.bridge.Callback;
  13. import com.reactnativenavigation.animation.VisibilityAnimator;
  14. import com.reactnativenavigation.params.BaseScreenParams;
  15. import com.reactnativenavigation.params.ContextualMenuParams;
  16. import com.reactnativenavigation.params.NavigationParams;
  17. import com.reactnativenavigation.params.StyleParams;
  18. import com.reactnativenavigation.params.TitleBarButtonParams;
  19. import com.reactnativenavigation.params.TitleBarLeftButtonParams;
  20. import com.reactnativenavigation.screens.Screen;
  21. import com.reactnativenavigation.utils.ViewUtils;
  22. import java.util.List;
  23. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  24. import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
  25. public class TopBar extends AppBarLayout {
  26. protected TitleBar titleBar;
  27. private ContextualMenu contextualMenu;
  28. protected FrameLayout titleBarAndContextualMenuContainer;
  29. protected TopTabs topTabs;
  30. private VisibilityAnimator visibilityAnimator;
  31. @Nullable
  32. private ContentView reactView;
  33. public TopBar(Context context) {
  34. super(context);
  35. setId(ViewUtils.generateViewId());
  36. createTopBarVisibilityAnimator();
  37. createLayout();
  38. }
  39. private void createTopBarVisibilityAnimator() {
  40. ViewUtils.runOnPreDraw(this, new Runnable() {
  41. @Override
  42. public void run() {
  43. visibilityAnimator = new VisibilityAnimator(TopBar.this,
  44. VisibilityAnimator.HideDirection.Up,
  45. getHeight());
  46. }
  47. });
  48. }
  49. protected void createLayout() {
  50. titleBarAndContextualMenuContainer = new FrameLayout(getContext());
  51. addView(titleBarAndContextualMenuContainer);
  52. }
  53. public void addTitleBarAndSetButtons(List<TitleBarButtonParams> rightButtons,
  54. TitleBarLeftButtonParams leftButton,
  55. LeftButtonOnClickListener leftButtonOnClickListener,
  56. String navigatorEventId, boolean overrideBackPressInJs) {
  57. titleBar = createTitleBar();
  58. addTitleBar();
  59. addButtons(rightButtons, leftButton, leftButtonOnClickListener, navigatorEventId, overrideBackPressInJs);
  60. }
  61. protected TitleBar createTitleBar() {
  62. return new TitleBar(getContext());
  63. }
  64. protected void addTitleBar() {
  65. titleBarAndContextualMenuContainer.addView(titleBar, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
  66. }
  67. private void addButtons(List<TitleBarButtonParams> rightButtons, TitleBarLeftButtonParams leftButton, LeftButtonOnClickListener leftButtonOnClickListener, String navigatorEventId, boolean overrideBackPressInJs) {
  68. titleBar.setRightButtons(rightButtons, navigatorEventId);
  69. titleBar.setLeftButton(leftButton, leftButtonOnClickListener, navigatorEventId, overrideBackPressInJs);
  70. }
  71. public void setTitle(String title, StyleParams styleParams) {
  72. titleBar.setTitle(title, styleParams);
  73. }
  74. public void setSubtitle(String subtitle) {
  75. titleBar.setSubtitle(subtitle);
  76. }
  77. public void setReactView(@NonNull StyleParams styleParams) {
  78. if (styleParams.hasTopBarCustomComponent()) {
  79. reactView = createReactView(styleParams);
  80. if ("fill".equals(styleParams.topBarReactViewAlignment)) {
  81. addReactViewFill(reactView);
  82. } else {
  83. addCenteredReactView(reactView);
  84. }
  85. }
  86. }
  87. private ContentView createReactView(StyleParams styleParams) {
  88. return new ContentView(getContext(),
  89. styleParams.topBarReactView,
  90. NavigationParams.EMPTY,
  91. styleParams.topBarReactViewInitialProps
  92. );
  93. }
  94. private void addReactViewFill(ContentView view) {
  95. view.setLayoutParams(new LayoutParams(MATCH_PARENT, ViewUtils.getToolBarHeight()));
  96. titleBar.addView(view);
  97. }
  98. private void addCenteredReactView(final ContentView view) {
  99. titleBar.addView(view, new LayoutParams(WRAP_CONTENT, ViewUtils.getToolBarHeight()));
  100. view.setOnDisplayListener(new Screen.OnDisplayListener() {
  101. @Override
  102. public void onDisplay() {
  103. view.getLayoutParams().width = (int) (float) view.getChildAt(0).getMeasuredWidth();
  104. ((ActionBar.LayoutParams) view.getLayoutParams()).gravity = Gravity.CENTER;
  105. view.requestLayout();
  106. }
  107. });
  108. }
  109. public void setButtonColor(StyleParams styleParams) {
  110. titleBar.setButtonColor(styleParams.titleBarButtonColor);
  111. }
  112. public void setStyle(StyleParams styleParams) {
  113. if (styleParams.topBarColor.hasColor()) {
  114. setBackgroundColor(styleParams.topBarColor.getColor());
  115. }
  116. if (styleParams.topBarTransparent) {
  117. setTransparent();
  118. }
  119. titleBar.setStyle(styleParams);
  120. setReactView(styleParams);
  121. setTopTabsStyle(styleParams);
  122. if (!styleParams.topBarElevationShadowEnabled) {
  123. disableElevationShadow();
  124. }
  125. }
  126. private void setTransparent() {
  127. setBackgroundColor(Color.TRANSPARENT);
  128. disableElevationShadow();
  129. }
  130. private void disableElevationShadow() {
  131. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  132. setOutlineProvider(null);
  133. }
  134. }
  135. public void setTitleBarRightButtons(String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
  136. titleBar.setRightButtons(titleBarButtons, navigatorEventId);
  137. }
  138. public TopTabs initTabs() {
  139. topTabs = new TopTabs(getContext());
  140. addView(topTabs, new ViewGroup.LayoutParams(MATCH_PARENT, (int) ViewUtils.convertDpToPixel(48)));
  141. return topTabs;
  142. }
  143. public void setTitleBarLeftButton(String navigatorEventId,
  144. LeftButtonOnClickListener leftButtonOnClickListener,
  145. TitleBarLeftButtonParams titleBarLeftButtonParams,
  146. boolean overrideBackPressInJs) {
  147. titleBar.setLeftButton(titleBarLeftButtonParams, leftButtonOnClickListener, navigatorEventId,
  148. overrideBackPressInJs);
  149. }
  150. private void setTopTabsStyle(StyleParams style) {
  151. if (topTabs == null) {
  152. return;
  153. }
  154. topTabs.setTopTabsTextColor(style);
  155. topTabs.setSelectedTabIndicatorStyle(style);
  156. topTabs.setScrollable(style);
  157. }
  158. public void showContextualMenu(final ContextualMenuParams params, StyleParams styleParams, Callback onButtonClicked) {
  159. final ContextualMenu menuToRemove = contextualMenu != null ? contextualMenu : null;
  160. contextualMenu = new ContextualMenu(getContext(), params, styleParams, onButtonClicked);
  161. titleBarAndContextualMenuContainer.addView(contextualMenu, new ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT));
  162. ViewUtils.runOnPreDraw(contextualMenu, new Runnable() {
  163. @Override
  164. public void run() {
  165. titleBar.hide();
  166. contextualMenu.show(new Runnable() {
  167. @Override
  168. public void run() {
  169. if (menuToRemove != null) {
  170. titleBarAndContextualMenuContainer.removeView(menuToRemove);
  171. }
  172. }
  173. });
  174. }
  175. });
  176. }
  177. public void onContextualMenuHidden() {
  178. contextualMenu = null;
  179. titleBar.show();
  180. }
  181. public void dismissContextualMenu() {
  182. if (contextualMenu != null) {
  183. contextualMenu.dismiss();
  184. contextualMenu = null;
  185. titleBar.show();
  186. }
  187. }
  188. public void destroy() {
  189. if (reactView != null) {
  190. reactView.unmountReactView();
  191. }
  192. titleBar.destroy();
  193. }
  194. public void onViewPagerScreenChanged(BaseScreenParams screenParams) {
  195. titleBar.onViewPagerScreenChanged(screenParams);
  196. }
  197. public void setVisible(boolean visible, boolean animate) {
  198. titleBar.setVisibility(!visible);
  199. visibilityAnimator.setVisible(visible, animate);
  200. }
  201. }