ViewPagerLayoutManager.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.edufound.reader.videoutil;
  2. import android.content.Context;
  3. import android.view.View;
  4. import com.orhanobut.logger.Logger;
  5. import androidx.recyclerview.widget.LinearLayoutManager;
  6. import androidx.recyclerview.widget.PagerSnapHelper;
  7. import androidx.recyclerview.widget.RecyclerView;
  8. public class ViewPagerLayoutManager extends LinearLayoutManager {
  9. private static final String TAG = "ViewPagerLayoutManager";
  10. private PagerSnapHelper mPagerSnapHelper;
  11. private OnViewPagerListener mOnViewPagerListener;
  12. private RecyclerView mRecyclerView;
  13. private int mDrift;//位移,用来判断移动方向
  14. private RecyclerView.OnChildAttachStateChangeListener mChildAttachStateChangeListener = new RecyclerView.OnChildAttachStateChangeListener() {
  15. @Override
  16. public void onChildViewAttachedToWindow(View view) {
  17. if (mOnViewPagerListener != null && getChildCount() == 1) {
  18. mOnViewPagerListener.onInitComplete();
  19. }
  20. }
  21. @Override
  22. public void onChildViewDetachedFromWindow(View view) {
  23. if (mDrift >= 0) {
  24. if (mOnViewPagerListener != null)
  25. mOnViewPagerListener.onPageRelease(true, getPosition(view));
  26. } else {
  27. if (mOnViewPagerListener != null)
  28. mOnViewPagerListener.onPageRelease(false, getPosition(view));
  29. }
  30. mOnViewPagerListener.onChildViewDetachedFromWindow(view);
  31. }
  32. };
  33. public ViewPagerLayoutManager(Context context, int orientation) {
  34. super(context, orientation, false);
  35. init();
  36. }
  37. public ViewPagerLayoutManager(Context context, int orientation, boolean reverseLayout) {
  38. super(context, orientation, reverseLayout);
  39. init();
  40. }
  41. private void init() {
  42. mPagerSnapHelper = new PagerSnapHelper();
  43. }
  44. @Override
  45. public void onAttachedToWindow(RecyclerView view) {
  46. super.onAttachedToWindow(view);
  47. mPagerSnapHelper.attachToRecyclerView(view);
  48. this.mRecyclerView = view;
  49. mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener);
  50. }
  51. @Override
  52. public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
  53. super.onLayoutChildren(recycler, state);
  54. }
  55. @Override
  56. public boolean canScrollHorizontally() {
  57. return false;
  58. }
  59. /**
  60. * 滑动状态的改变
  61. * 缓慢拖拽-> SCROLL_STATE_DRAGGING
  62. * 快速滚动-> SCROLL_STATE_SETTLING
  63. * 空闲状态-> SCROLL_STATE_IDLE
  64. *
  65. * @param state
  66. */
  67. @Override
  68. public void onScrollStateChanged(int state) {
  69. switch (state) {
  70. case RecyclerView.SCROLL_STATE_IDLE:
  71. View viewIdle = mPagerSnapHelper.findSnapView(this);
  72. if (getChildCount() > 1) {
  73. //有多余的
  74. if (mDrift >= 0) {
  75. removeViewAt(1);
  76. } else {
  77. removeViewAt(0);
  78. }
  79. }
  80. if (viewIdle != null) {
  81. int positionIdle = getPosition(viewIdle);
  82. if (mOnViewPagerListener != null && getChildCount() == 1) {
  83. mOnViewPagerListener.onPageSelected(positionIdle, positionIdle == getItemCount() - 1);
  84. }
  85. }
  86. break;
  87. }
  88. }
  89. /**
  90. * 监听竖直方向的相对偏移量
  91. *
  92. * @param dy
  93. * @param recycler
  94. * @param state
  95. * @return
  96. */
  97. @Override
  98. public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
  99. this.mDrift = dy;
  100. return super.scrollVerticallyBy(dy, recycler, state);
  101. }
  102. /**
  103. * 监听水平方向的相对偏移量
  104. *
  105. * @param dx
  106. * @param recycler
  107. * @param state
  108. * @return
  109. */
  110. @Override
  111. public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
  112. this.mDrift = dx;
  113. return super.scrollHorizontallyBy(dx, recycler, state);
  114. // return 0;
  115. }
  116. /**
  117. * 设置监听
  118. *
  119. * @param listener
  120. */
  121. public void setOnViewPagerListener(OnViewPagerListener listener) {
  122. this.mOnViewPagerListener = listener;
  123. }
  124. }