react-native-navigation的迁移库

Screen.java 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package com.reactnativenavigation.screens;
  2. import android.annotation.TargetApi;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.graphics.Color;
  6. import android.os.Build;
  7. import android.util.Log;
  8. import android.view.Window;
  9. import android.widget.RelativeLayout;
  10. import com.reactnativenavigation.animation.VisibilityAnimator;
  11. import com.reactnativenavigation.params.ScreenParams;
  12. import com.reactnativenavigation.params.ScreenStyleParams;
  13. import com.reactnativenavigation.params.TitleBarButtonParams;
  14. import com.reactnativenavigation.params.TitleBarLeftButtonParams;
  15. import com.reactnativenavigation.utils.SdkSupports;
  16. import com.reactnativenavigation.utils.ViewUtils;
  17. import com.reactnativenavigation.views.ScrollDirectionListener;
  18. import com.reactnativenavigation.views.TitleBarBackButtonListener;
  19. import com.reactnativenavigation.views.TopBar;
  20. import java.util.List;
  21. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  22. import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
  23. public abstract class Screen extends RelativeLayout implements ScrollDirectionListener.OnScrollChanged {
  24. protected final ScreenParams screenParams;
  25. protected TopBar topBar;
  26. private final TitleBarBackButtonListener titleBarBackButtonListener;
  27. private VisibilityAnimator topBarVisibilityAnimator;
  28. public Screen(Context context, ScreenParams screenParams, TitleBarBackButtonListener titleBarBackButtonListener) {
  29. super(context);
  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. topBar.addTitleBarAndSetButtons(screenParams.rightButtons, screenParams.leftButton,
  43. titleBarBackButtonListener, screenParams.navigatorEventId);
  44. topBar.setTitle(screenParams.title);
  45. }
  46. private void createTopBar() {
  47. topBar = new TopBar(getContext());
  48. createTopBarVisibilityAnimator();
  49. addView(topBar, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
  50. }
  51. private void createTopBarVisibilityAnimator() {
  52. ViewUtils.runOnPreDraw(topBar, new Runnable() {
  53. @Override
  54. public void run() {
  55. if (topBarVisibilityAnimator == null) {
  56. topBarVisibilityAnimator = new VisibilityAnimator(topBar, VisibilityAnimator.HideDirection.Up, topBar.getHeight());
  57. }
  58. }
  59. });
  60. }
  61. private void setStyle(ScreenStyleParams styleParams) {
  62. setStatusBarColor(styleParams.statusBarColor);
  63. setNavigationBarColor(styleParams.navigationBarColor);
  64. topBar.setStyle(styleParams);
  65. }
  66. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  67. private void setStatusBarColor(ScreenStyleParams.Color statusBarColor) {
  68. if (!SdkSupports.lollipop()) {
  69. return;
  70. }
  71. final Activity context = (Activity) getContext();
  72. final Window window = context.getWindow();
  73. if (statusBarColor.hasColor()) {
  74. window.setStatusBarColor(statusBarColor.getColor());
  75. } else {
  76. window.setStatusBarColor(Color.BLACK);
  77. }
  78. }
  79. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  80. public void setNavigationBarColor(ScreenStyleParams.Color navigationBarColor) {
  81. if (!SdkSupports.lollipop()) {
  82. return;
  83. }
  84. final Activity context = (Activity) getContext();
  85. final Window window = context.getWindow();
  86. if (navigationBarColor.hasColor()) {
  87. window.setNavigationBarColor(navigationBarColor.getColor());
  88. } else {
  89. window.setNavigationBarColor(Color.BLACK);
  90. }
  91. }
  92. @Override
  93. protected void onAttachedToWindow() {
  94. super.onAttachedToWindow();
  95. Log.d("LOG", "Screen.onAttachedToWindow " + this);
  96. }
  97. @Override
  98. protected void onDetachedFromWindow() {
  99. super.onDetachedFromWindow();
  100. Log.d("LOG", "Screen.onDetachedFromWindow " + this);
  101. }
  102. @Override
  103. public void onScrollChanged(ScrollDirectionListener.Direction direction) {
  104. topBarVisibilityAnimator.onScrollChanged(direction);
  105. }
  106. public abstract void ensureUnmountOnDetachedFromWindow();
  107. public abstract void preventUnmountOnDetachedFromWindow();
  108. public String getScreenInstanceId() {
  109. return screenParams.screenInstanceId;
  110. }
  111. public void setTopBarVisible(boolean visible, boolean animate) {
  112. topBarVisibilityAnimator.setVisible(visible, animate);
  113. }
  114. public void setTitleBarTitle(String title) {
  115. topBar.setTitle(title);
  116. }
  117. public void setTitleBarRightButtons(String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
  118. topBar.setTitleBarRightButtons(navigatorEventId, titleBarButtons);
  119. }
  120. public void setTitleBarLeftButton(String navigatorEventId, TitleBarBackButtonListener backButtonListener,
  121. TitleBarLeftButtonParams titleBarLeftButtonParams) {
  122. topBar.setTitleBarRightButton(navigatorEventId, backButtonListener, titleBarLeftButtonParams);
  123. }
  124. }