react-native-navigation的迁移库

ContentView.java 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package com.reactnativenavigation.views;
  2. import android.content.Context;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import com.facebook.react.ReactRootView;
  6. import com.reactnativenavigation.NavigationApplication;
  7. import com.reactnativenavigation.params.NavigationParams;
  8. import com.reactnativenavigation.screens.SingleScreen;
  9. import com.reactnativenavigation.utils.ViewUtils;
  10. import com.reactnativenavigation.views.utils.ViewMeasurer;
  11. public class ContentView extends ReactRootView {
  12. private final String screenId;
  13. private final NavigationParams navigationParams;
  14. private Bundle initialProps;
  15. boolean isContentVisible = false;
  16. private SingleScreen.OnDisplayListener onDisplayListener;
  17. protected ViewMeasurer viewMeasurer;
  18. public void setOnDisplayListener(SingleScreen.OnDisplayListener onDisplayListener) {
  19. this.onDisplayListener = onDisplayListener;
  20. }
  21. public ContentView(Context context, String screenId, NavigationParams navigationParams) {
  22. this(context, screenId, navigationParams, Bundle.EMPTY);
  23. }
  24. public ContentView(Context context, String screenId, NavigationParams navigationParams, Bundle initialProps) {
  25. super(context);
  26. this.screenId = screenId;
  27. this.navigationParams = navigationParams;
  28. this.initialProps = initialProps;
  29. attachToJS();
  30. viewMeasurer = new ViewMeasurer();
  31. }
  32. public void setViewMeasurer(ViewMeasurer viewMeasurer) {
  33. this.viewMeasurer = viewMeasurer;
  34. }
  35. private void attachToJS() {
  36. navigationParams.toBundle().putAll(initialProps);
  37. startReactApplication(NavigationApplication.instance.getReactGateway().getReactInstanceManager(),
  38. screenId,
  39. createInitialParams()
  40. );
  41. }
  42. private Bundle createInitialParams() {
  43. final Bundle params = new Bundle();
  44. params.putAll(navigationParams.toBundle());
  45. params.putAll(initialProps);
  46. return params;
  47. }
  48. public String getNavigatorEventId() {
  49. return navigationParams.navigatorEventId;
  50. }
  51. public void unmountReactView() {
  52. unmountReactApplication();
  53. }
  54. @Override
  55. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  56. int widthSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST);
  57. int heightSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.AT_MOST);
  58. super.onMeasure(widthSpec, heightSpec);
  59. int measuredHeight = viewMeasurer.getMeasuredHeight(heightSpec);
  60. setMeasuredDimension(viewMeasurer.getMeasuredWidth(widthSpec), measuredHeight);
  61. }
  62. @Override
  63. public void onViewAdded(final View child) {
  64. super.onViewAdded(child);
  65. detectContentViewVisible(child);
  66. }
  67. private void detectContentViewVisible(final View child) {
  68. if (onDisplayListener != null) {
  69. post(new Runnable() {
  70. @Override
  71. public void run() {
  72. ViewUtils.runOnPreDraw(child, new Runnable() {
  73. @Override
  74. public void run() {
  75. if (!isContentVisible) {
  76. isContentVisible = true;
  77. onDisplayListener.onDisplay();
  78. onDisplayListener = null;
  79. }
  80. }
  81. });
  82. }
  83. });
  84. }
  85. }
  86. }