react-native-navigation的迁移库

Screen.java 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package com.reactnativenavigation.screens;
  2. import android.annotation.TargetApi;
  3. import android.app.Activity;
  4. import android.graphics.Color;
  5. import android.os.Build;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.view.Window;
  8. import android.widget.RelativeLayout;
  9. import com.reactnativenavigation.animation.VisibilityAnimator;
  10. import com.reactnativenavigation.params.ScreenParams;
  11. import com.reactnativenavigation.params.StyleParams;
  12. import com.reactnativenavigation.params.TitleBarButtonParams;
  13. import com.reactnativenavigation.params.TitleBarLeftButtonParams;
  14. import com.reactnativenavigation.utils.SdkSupports;
  15. import com.reactnativenavigation.utils.ViewUtils;
  16. import com.reactnativenavigation.views.TitleBarBackButtonListener;
  17. import com.reactnativenavigation.views.TopBar;
  18. import java.util.List;
  19. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  20. import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
  21. public abstract class Screen extends RelativeLayout {
  22. protected final AppCompatActivity activity;
  23. protected final ScreenParams screenParams;
  24. protected TopBar topBar;
  25. private final TitleBarBackButtonListener titleBarBackButtonListener;
  26. private VisibilityAnimator topBarVisibilityAnimator;
  27. public Screen(AppCompatActivity activity, ScreenParams screenParams, TitleBarBackButtonListener titleBarBackButtonListener) {
  28. super(activity);
  29. this.activity = activity;
  30. this.screenParams = screenParams;
  31. this.titleBarBackButtonListener = titleBarBackButtonListener;
  32. createViews();
  33. setStyle(screenParams.styleParams);
  34. }
  35. private void createViews() {
  36. createTopBar();
  37. createTitleBar();
  38. createContent();
  39. }
  40. protected abstract void createContent();
  41. private void createTitleBar() {
  42. addTitleBarButtons();
  43. topBar.setTitle(screenParams.title);
  44. }
  45. private void addTitleBarButtons() {
  46. setButtonColorFromScreen(screenParams.rightButtons);
  47. if (screenParams.leftButton != null) {
  48. screenParams.leftButton.setColorFromScreenStyle(screenParams.styleParams.titleBarButtonColor);
  49. }
  50. topBar.addTitleBarAndSetButtons(screenParams.rightButtons, screenParams.leftButton,
  51. titleBarBackButtonListener, screenParams.navigatorEventId);
  52. }
  53. private void createTopBar() {
  54. topBar = new TopBar(getContext());
  55. createTopBarVisibilityAnimator();
  56. addView(topBar, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
  57. }
  58. private void createTopBarVisibilityAnimator() {
  59. ViewUtils.runOnPreDraw(topBar, new Runnable() {
  60. @Override
  61. public void run() {
  62. if (topBarVisibilityAnimator == null) {
  63. topBarVisibilityAnimator = new VisibilityAnimator(topBar,
  64. VisibilityAnimator.HideDirection.Up,
  65. topBar.getHeight());
  66. }
  67. }
  68. });
  69. }
  70. private void setStyle(StyleParams styleParams) {
  71. setStatusBarColor(styleParams.statusBarColor);
  72. setNavigationBarColor(styleParams.navigationBarColor);
  73. topBar.setStyle(styleParams);
  74. }
  75. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  76. private void setStatusBarColor(StyleParams.Color statusBarColor) {
  77. if (!SdkSupports.lollipop()) {
  78. return;
  79. }
  80. final Activity context = (Activity) getContext();
  81. final Window window = context.getWindow();
  82. if (statusBarColor.hasColor()) {
  83. window.setStatusBarColor(statusBarColor.getColor());
  84. } else {
  85. window.setStatusBarColor(Color.BLACK);
  86. }
  87. }
  88. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  89. public void setNavigationBarColor(StyleParams.Color navigationBarColor) {
  90. if (!SdkSupports.lollipop()) {
  91. return;
  92. }
  93. final Activity context = (Activity) getContext();
  94. final Window window = context.getWindow();
  95. if (navigationBarColor.hasColor()) {
  96. window.setNavigationBarColor(navigationBarColor.getColor());
  97. } else {
  98. window.setNavigationBarColor(Color.BLACK);
  99. }
  100. }
  101. public abstract void ensureUnmountOnDetachedFromWindow();
  102. public abstract void preventUnmountOnDetachedFromWindow();
  103. public abstract void preventMountAfterReattachedToWindow();
  104. public String getScreenInstanceId() {
  105. return screenParams.screenInstanceId;
  106. }
  107. public void setTopBarVisible(boolean visible, boolean animate) {
  108. topBarVisibilityAnimator.setVisible(visible, animate);
  109. }
  110. public void setTitleBarTitle(String title) {
  111. topBar.setTitle(title);
  112. }
  113. public void setTitleBarRightButtons(String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
  114. setButtonColorFromScreen(titleBarButtons);
  115. topBar.setTitleBarRightButtons(navigatorEventId, titleBarButtons);
  116. }
  117. public void setTitleBarLeftButton(String navigatorEventId, TitleBarBackButtonListener backButtonListener,
  118. TitleBarLeftButtonParams titleBarLeftButtonParams) {
  119. topBar.setTitleBarRightButton(navigatorEventId, backButtonListener, titleBarLeftButtonParams);
  120. }
  121. public StyleParams getStyleParams() {
  122. return screenParams.styleParams;
  123. }
  124. private void setButtonColorFromScreen(List<TitleBarButtonParams> titleBarButtonParams) {
  125. if (titleBarButtonParams == null) {
  126. return;
  127. }
  128. for (TitleBarButtonParams titleBarButtonParam : titleBarButtonParams) {
  129. titleBarButtonParam.setColorFromScreenStyle(screenParams.styleParams.titleBarButtonColor);
  130. }
  131. }
  132. }