react-native-navigation的迁移库

TitleBarButton.java 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package com.reactnativenavigation.views;
  2. import android.support.annotation.NonNull;
  3. import android.support.annotation.Nullable;
  4. import android.support.v7.widget.ActionMenuView;
  5. import android.text.SpannableStringBuilder;
  6. import android.text.TextUtils;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import android.widget.TextView;
  12. import com.reactnativenavigation.NavigationApplication;
  13. import com.reactnativenavigation.params.TitleBarButtonParams;
  14. import com.reactnativenavigation.utils.TypefaceSpan;
  15. import com.reactnativenavigation.utils.ViewUtils;
  16. import java.util.ArrayList;
  17. class TitleBarButton implements MenuItem.OnMenuItemClickListener {
  18. protected final Menu menu;
  19. protected final ViewGroup parent;
  20. private TitleBarButtonParams buttonParams;
  21. @Nullable protected String navigatorEventId;
  22. TitleBarButton(Menu menu, ViewGroup parent, TitleBarButtonParams buttonParams, @Nullable String navigatorEventId) {
  23. this.menu = menu;
  24. this.parent = parent;
  25. this.buttonParams = buttonParams;
  26. this.navigatorEventId = navigatorEventId;
  27. }
  28. MenuItem addToMenu(int index) {
  29. MenuItem item = createMenuItem(index);
  30. item.setShowAsAction(buttonParams.showAsAction.action);
  31. item.setEnabled(buttonParams.enabled);
  32. if (buttonParams.hasComponent()) {
  33. item.setActionView(new TitleBarButtonComponent(parent.getContext(), buttonParams.componentName, buttonParams.componentProps));
  34. }
  35. setIcon(item, index);
  36. setColor();
  37. setFont();
  38. item.setOnMenuItemClickListener(this);
  39. return item;
  40. }
  41. private MenuItem createMenuItem(int index) {
  42. if (!buttonParams.hasFont() || TextUtils.isEmpty(buttonParams.label)) {
  43. return menu.add(Menu.NONE, Menu.NONE, index, buttonParams.label);
  44. }
  45. TypefaceSpan span = new TypefaceSpan(buttonParams.font.get());
  46. SpannableStringBuilder title = new SpannableStringBuilder(buttonParams.label);
  47. title.setSpan(span, 0, title.length(), 0);
  48. return menu.add(Menu.NONE, Menu.NONE, index, title);
  49. }
  50. private void setIcon(MenuItem item, int index) {
  51. if (hasIcon()) {
  52. item.setIcon(buttonParams.icon);
  53. if (TextUtils.isEmpty(buttonParams.label)) {
  54. dontShowLabelOnLongPress(index);
  55. }
  56. }
  57. }
  58. private void dontShowLabelOnLongPress(final int index) {
  59. ViewUtils.runOnPreDraw(parent, new Runnable() {
  60. @Override
  61. public void run() {
  62. ActionMenuView actionMenuView = ViewUtils.findChildByClass(parent, ActionMenuView.class);
  63. if (actionMenuView != null && actionMenuView.getChildAt(index) != null) {
  64. actionMenuView.getChildAt(index).setOnLongClickListener(null);
  65. }
  66. }
  67. });
  68. }
  69. private void setColor() {
  70. if (!hasColor() || disableIconTint()) {
  71. return;
  72. }
  73. if (hasIcon()) {
  74. setIconColor();
  75. } else {
  76. setTextColor();
  77. }
  78. }
  79. private void setIconColor() {
  80. ViewUtils.tintDrawable(buttonParams.icon, buttonParams.color.getColor(), buttonParams.enabled);
  81. }
  82. private void setTextColor() {
  83. ViewUtils.runOnPreDraw(parent, new Runnable() {
  84. @Override
  85. public void run() {
  86. ArrayList<View> outViews = findActualTextViewInMenuByLabel();
  87. setTextColorForFoundButtonViews(outViews);
  88. }
  89. });
  90. }
  91. private void setFont() {
  92. if (!buttonParams.hasFont()) {
  93. return;
  94. }
  95. ArrayList<View> buttons = findActualTextViewInMenuByLabel();
  96. setTextFontForFoundButtonViews(buttons);
  97. }
  98. @NonNull
  99. private ArrayList<View> findActualTextViewInMenuByLabel() {
  100. ArrayList<View> outViews = new ArrayList<>();
  101. parent.findViewsWithText(outViews, buttonParams.label, View.FIND_VIEWS_WITH_TEXT);
  102. return outViews;
  103. }
  104. private void setTextColorForFoundButtonViews(ArrayList<View> buttons) {
  105. for (View button : buttons) {
  106. ((TextView) button).setTextColor(buttonParams.getColor().getColor());
  107. }
  108. }
  109. private void setTextFontForFoundButtonViews(ArrayList<View> buttons) {
  110. for (View button : buttons) {
  111. if (buttonParams.hasFont()) {
  112. ((TextView) button).setTypeface(buttonParams.font.get());
  113. }
  114. }
  115. }
  116. private boolean hasIcon() {
  117. return buttonParams.icon != null;
  118. }
  119. private boolean hasColor() {
  120. return buttonParams.color.hasColor();
  121. }
  122. private boolean disableIconTint() {
  123. return buttonParams.disableIconTint;
  124. }
  125. @Override
  126. public boolean onMenuItemClick(MenuItem item) {
  127. NavigationApplication.instance.getEventEmitter().sendNavigatorEvent(buttonParams.eventId, navigatorEventId);
  128. return true;
  129. }
  130. }