react-native-navigation的迁移库

TitleBar.java 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package com.reactnativenavigation.views.titlebar;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.graphics.Typeface;
  6. import android.support.v7.widget.Toolbar;
  7. import android.util.Log;
  8. import android.view.Gravity;
  9. import android.view.ViewGroup;
  10. import android.widget.TextView;
  11. import com.reactnativenavigation.parse.Alignment;
  12. import com.reactnativenavigation.parse.BackButton;
  13. import com.reactnativenavigation.parse.Component;
  14. import com.reactnativenavigation.parse.params.Button;
  15. import com.reactnativenavigation.parse.params.Color;
  16. import com.reactnativenavigation.utils.ButtonOptionsPresenter;
  17. import com.reactnativenavigation.utils.ImageLoader;
  18. import com.reactnativenavigation.utils.UiUtils;
  19. import com.reactnativenavigation.utils.ViewUtils;
  20. import com.reactnativenavigation.viewcontrollers.ReactViewCreator;
  21. import com.reactnativenavigation.viewcontrollers.TitleBarReactViewController;
  22. import com.reactnativenavigation.viewcontrollers.TopBarButtonController;
  23. import com.reactnativenavigation.viewcontrollers.button.NavigationIconResolver;
  24. import java.util.ArrayList;
  25. import java.util.List;
  26. import javax.annotation.Nullable;
  27. import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
  28. @SuppressLint("ViewConstructor")
  29. public class TitleBar extends Toolbar {
  30. private final ReactViewCreator buttonCreator;
  31. private TitleBarReactViewController reactViewController;
  32. private final TitleBarReactViewCreator reactViewCreator;
  33. private final TopBarButtonController.OnClickListener onClickListener;
  34. private final List<TopBarButtonController> rightButtonControllers = new ArrayList<>();
  35. private TopBarButtonController leftButtonController;
  36. private ImageLoader imageLoader;
  37. public TitleBar(Context context, ReactViewCreator buttonCreator, TitleBarReactViewCreator reactViewCreator, TopBarButtonController.OnClickListener onClickListener, ImageLoader imageLoader) {
  38. super(context);
  39. this.buttonCreator = buttonCreator;
  40. this.reactViewCreator = reactViewCreator;
  41. this.imageLoader = imageLoader;
  42. reactViewController = new TitleBarReactViewController((Activity) context, reactViewCreator);
  43. this.onClickListener = onClickListener;
  44. getMenu();
  45. setContentDescription("titleBar");
  46. }
  47. @Override
  48. public void setTitle(CharSequence title) {
  49. clearComponent();
  50. super.setTitle(title);
  51. }
  52. public String getTitle() {
  53. return super.getTitle() == null ? "" : (String) super.getTitle();
  54. }
  55. public void setTitleTextColor(Color color) {
  56. if (color.hasValue()) setTitleTextColor(color.get());
  57. }
  58. public void setComponent(Component component) {
  59. clearTitle();
  60. clearSubtitle();
  61. reactViewController.setComponent(component);
  62. addView(reactViewController.getView(), getComponentLayoutParams(component));
  63. }
  64. public void setBackgroundColor(Color color) {
  65. if (color.hasValue()) setBackgroundColor(color.get());
  66. }
  67. public void setTitleFontSize(double size) {
  68. TextView titleTextView = findTitleTextView();
  69. if (titleTextView != null) titleTextView.setTextSize((float) size);
  70. }
  71. public void setTitleTypeface(Typeface typeface) {
  72. TextView titleTextView = findTitleTextView();
  73. if (titleTextView != null) titleTextView.setTypeface(typeface);
  74. }
  75. public void setTitleAlignment(Alignment alignment) {
  76. TextView title = findTitleTextView();
  77. if (title == null) return;
  78. alignTextView(alignment, title);
  79. }
  80. public void setSubtitleTypeface(Typeface typeface) {
  81. TextView subtitleTextView = findSubtitleTextView();
  82. if (subtitleTextView != null) subtitleTextView.setTypeface(typeface);
  83. }
  84. public void setSubtitleFontSize(double size) {
  85. TextView subtitleTextView = findSubtitleTextView();
  86. if (subtitleTextView != null) subtitleTextView.setTextSize((float) size);
  87. }
  88. public void setSubtitleAlignment(Alignment alignment) {
  89. TextView subtitle = findSubtitleTextView();
  90. if (subtitle == null) return;
  91. alignTextView(alignment, subtitle);
  92. }
  93. private void alignTextView(Alignment alignment, TextView view) {
  94. view.post(() -> {
  95. if (alignment == Alignment.Center) {
  96. view.setX((getWidth() - view.getWidth()) / 2);
  97. } else if (leftButtonController != null) {
  98. view.setX(getContentInsetStartWithNavigation());
  99. } else {
  100. view.setX(UiUtils.dpToPx(getContext(), 16));
  101. }
  102. });
  103. }
  104. @Nullable
  105. public TextView findTitleTextView() {
  106. List<TextView> children = ViewUtils.findChildrenByClass(this, TextView.class, textView -> textView.getText().equals(getTitle()));
  107. return children.isEmpty() ? null : children.get(0);
  108. }
  109. @Nullable
  110. public TextView findSubtitleTextView() {
  111. List<TextView> children = ViewUtils.findChildrenByClass(this, TextView.class, textView -> textView.getText().equals(getSubtitle()));
  112. return children.isEmpty() ? null : children.get(0);
  113. }
  114. public void clear() {
  115. clearTitle();
  116. clearSubtitle();
  117. clearRightButtons();
  118. clearLeftButton();
  119. clearComponent();
  120. }
  121. private void clearTitle() {
  122. setTitle(null);
  123. }
  124. private void clearSubtitle() {
  125. setSubtitle(null);
  126. }
  127. private void clearComponent() {
  128. reactViewController.destroy();
  129. reactViewController = new TitleBarReactViewController((Activity) getContext(), reactViewCreator);
  130. }
  131. private void clearLeftButton() {
  132. setNavigationIcon(null);
  133. if (leftButtonController != null) {
  134. leftButtonController.destroy();
  135. leftButtonController = null;
  136. }
  137. }
  138. private void clearRightButtons() {
  139. for (TopBarButtonController button : rightButtonControllers) {
  140. button.destroy();
  141. }
  142. rightButtonControllers.clear();
  143. if (getMenu().size() > 0) getMenu().clear();
  144. }
  145. public void setBackButton(BackButton button) {
  146. setLeftButton(button);
  147. }
  148. public void setLeftButtons(List<Button> leftButtons) {
  149. if (leftButtons == null) return;
  150. if (leftButtons.isEmpty()) {
  151. clearLeftButton();
  152. return;
  153. }
  154. if (leftButtons.size() > 1) {
  155. Log.w("RNN", "Use a custom TopBar to have more than one left button");
  156. }
  157. setLeftButton(leftButtons.get(0));
  158. }
  159. private void setLeftButton(final Button button) {
  160. TopBarButtonController controller = createButtonController(button);
  161. leftButtonController = controller;
  162. controller.applyNavigationIcon(this);
  163. }
  164. public void setRightButtons(List<Button> rightButtons) {
  165. if (rightButtons == null) return;
  166. clearRightButtons();
  167. for (int i = 0; i < rightButtons.size(); i++) {
  168. TopBarButtonController controller = createButtonController(rightButtons.get(i));
  169. rightButtonControllers.add(controller);
  170. controller.addToMenu(this, rightButtons.size() - i - 1);
  171. }
  172. }
  173. public TopBarButtonController createButtonController(Button button) {
  174. return new TopBarButtonController((Activity) getContext(),
  175. new NavigationIconResolver(getContext(), imageLoader),
  176. imageLoader,
  177. new ButtonOptionsPresenter(this, button),
  178. button,
  179. buttonCreator,
  180. onClickListener
  181. );
  182. }
  183. public Toolbar.LayoutParams getComponentLayoutParams(Component component) {
  184. LayoutParams lp = new LayoutParams(MATCH_PARENT, getHeight());
  185. if (component.alignment == Alignment.Center) {
  186. lp.gravity = Gravity.CENTER;
  187. }
  188. return lp;
  189. }
  190. public void setHeight(int height) {
  191. if (height == getLayoutParams().height) return;
  192. ViewGroup.LayoutParams lp = getLayoutParams();
  193. lp.height = (int) UiUtils.dpToPx(getContext(), height);
  194. setLayoutParams(lp);
  195. }
  196. }