react-native-navigation的迁移库

CollapsingViewPagerScreen.java 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package com.reactnativenavigation.screens;
  2. import android.annotation.SuppressLint;
  3. import android.content.Context;
  4. import android.support.v4.view.ViewPager;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.view.MotionEvent;
  7. import android.widget.ScrollView;
  8. import com.facebook.react.uimanager.RootViewUtil;
  9. import com.reactnativenavigation.events.Event;
  10. import com.reactnativenavigation.events.ViewPagerScreenChangedEvent;
  11. import com.reactnativenavigation.events.ViewPagerScreenScrollStartEvent;
  12. import com.reactnativenavigation.params.PageParams;
  13. import com.reactnativenavigation.params.ScreenParams;
  14. import com.reactnativenavigation.views.CollapsingContentView;
  15. import com.reactnativenavigation.views.ContentView;
  16. import com.reactnativenavigation.views.LeftButtonOnClickListener;
  17. import com.reactnativenavigation.views.TopBar;
  18. import com.reactnativenavigation.views.collapsingToolbar.CollapseAmount;
  19. import com.reactnativenavigation.views.collapsingToolbar.CollapseCalculator;
  20. import com.reactnativenavigation.views.collapsingToolbar.CollapsingTopBar;
  21. import com.reactnativenavigation.views.collapsingToolbar.CollapsingView;
  22. import com.reactnativenavigation.views.collapsingToolbar.CollapsingViewMeasurer;
  23. import com.reactnativenavigation.views.collapsingToolbar.CollapsingViewPager;
  24. import com.reactnativenavigation.views.collapsingToolbar.CollapsingViewPagerContentViewMeasurer;
  25. import com.reactnativenavigation.views.collapsingToolbar.OnScrollListener;
  26. import com.reactnativenavigation.views.collapsingToolbar.OnScrollViewAddedListener;
  27. import com.reactnativenavigation.views.collapsingToolbar.ScrollListener;
  28. import com.reactnativenavigation.views.collapsingToolbar.behaviours.CollapseBehaviour;
  29. @SuppressLint("ViewConstructor")
  30. public class CollapsingViewPagerScreen extends ViewPagerScreen {
  31. public CollapsingViewPagerScreen(AppCompatActivity activity, ScreenParams screenParams, LeftButtonOnClickListener backButtonListener) {
  32. super(activity, screenParams, backButtonListener);
  33. }
  34. @Override
  35. protected TopBar createTopBar() {
  36. final CollapsingTopBar topBar = new CollapsingTopBar(getContext(), styleParams);
  37. topBar.setScrollListener(getScrollListener(topBar));
  38. return topBar;
  39. }
  40. @Override
  41. protected ViewPager createViewPager(Context context) {
  42. CollapsingViewPager viewPager = new CollapsingViewPager(context);
  43. if (screenParams.styleParams.drawScreenBelowTopBar) {
  44. viewPager.setViewMeasurer(new CollapsingViewMeasurer((CollapsingTopBar) topBar, this, styleParams));
  45. }
  46. return viewPager;
  47. }
  48. protected ContentView createContentView(PageParams tab) {
  49. CollapsingContentView contentView = new CollapsingContentView(getContext(), tab.screenId, tab.navigationParams);
  50. contentView.setViewMeasurer(new CollapsingViewPagerContentViewMeasurer((CollapsingTopBar) topBar, this, screenParams.styleParams));
  51. setupCollapseDetection(contentView);
  52. return contentView;
  53. }
  54. private void setupCollapseDetection(CollapsingContentView contentView) {
  55. ScrollListener scrollListener = getScrollListener((CollapsingView) topBar);
  56. contentView.setupCollapseDetection(scrollListener, new OnScrollViewAddedListener() {
  57. @Override
  58. public void onScrollViewAdded(ScrollView scrollView) {
  59. ((CollapsingTopBar) topBar).onScrollViewAdded(scrollView);
  60. }
  61. });
  62. }
  63. private ScrollListener getScrollListener(final CollapsingView topBar) {
  64. return new ScrollListener(new CollapseCalculator(topBar, getCollapseBehaviour()),
  65. new OnScrollListener() {
  66. @Override
  67. public void onScroll(MotionEvent event, CollapseAmount amount) {
  68. RootViewUtil.getRootView(getCurrentPage()).onChildStartedNativeGesture(event);
  69. topBar.collapse(amount);
  70. ((CollapsingView) viewPager).collapse(amount);
  71. }
  72. @Override
  73. public void onFling(CollapseAmount amount) {
  74. topBar.fling(amount);
  75. ((CollapsingView) viewPager).fling(amount);
  76. }
  77. },
  78. getCollapseBehaviour()
  79. );
  80. }
  81. private CollapseBehaviour getCollapseBehaviour() {
  82. return screenParams.styleParams.collapsingTopBarParams.collapseBehaviour;
  83. }
  84. @Override
  85. public void onEvent(Event event) {
  86. super.onEvent(event);
  87. if (ViewPagerScreenScrollStartEvent.TYPE.equals(event.getType()) || ViewPagerScreenChangedEvent.TYPE.equals(event.getType())) {
  88. if (screenParams.styleParams.collapsingTopBarParams.expendOnTopTabChange) {
  89. ((CollapsingView) topBar).collapse(new CollapseAmount(CollapseCalculator.Direction.Down));
  90. ((CollapsingView) viewPager).collapse(new CollapseAmount(CollapseCalculator.Direction.Down));
  91. }
  92. }
  93. }
  94. @Override
  95. public void destroy() {
  96. super.destroy();
  97. for (ContentView contentView : contentViews) {
  98. if (contentView instanceof CollapsingContentView) {
  99. ((CollapsingContentView) contentView).destroy();
  100. }
  101. }
  102. topBar.destroy();
  103. }
  104. protected ContentView getCurrentPage() {
  105. return (ContentView) viewPager.getChildAt(viewPager.getCurrentItem());
  106. }
  107. }