CBLoopViewPager.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package com.bigkoo.convenientbanner.view;
  2. import android.content.Context;
  3. import androidx.viewpager.widget.PagerAdapter;
  4. import androidx.viewpager.widget.ViewPager;
  5. import android.util.AttributeSet;
  6. import android.view.MotionEvent;
  7. import com.bigkoo.convenientbanner.adapter.CBPageAdapter;
  8. import com.bigkoo.convenientbanner.listener.OnItemClickListener;
  9. public class CBLoopViewPager extends ViewPager {
  10. OnPageChangeListener mOuterPageChangeListener;
  11. private OnItemClickListener onItemClickListener;
  12. private CBPageAdapter mAdapter;
  13. private boolean isCanScroll = true;
  14. private boolean canLoop = true;
  15. public void setAdapter(PagerAdapter adapter, boolean canLoop) {
  16. mAdapter = (CBPageAdapter) adapter;
  17. mAdapter.setCanLoop(canLoop);
  18. mAdapter.setViewPager(this);
  19. super.setAdapter(mAdapter);
  20. setCurrentItem(getFristItem(), false);
  21. }
  22. public int getFristItem() {
  23. return canLoop ? mAdapter.getRealCount() : 0;
  24. }
  25. public int getLastItem() {
  26. return mAdapter.getRealCount() - 1;
  27. }
  28. public boolean isCanScroll() {
  29. return isCanScroll;
  30. }
  31. public void setCanScroll(boolean isCanScroll) {
  32. this.isCanScroll = isCanScroll;
  33. }
  34. private float oldX = 0, newX = 0;
  35. private static final float sens = 5;
  36. @Override
  37. public boolean onTouchEvent(MotionEvent ev) {
  38. if (isCanScroll) {
  39. if (onItemClickListener != null) {
  40. switch (ev.getAction()) {
  41. case MotionEvent.ACTION_DOWN:
  42. oldX = ev.getX();
  43. break;
  44. case MotionEvent.ACTION_UP:
  45. newX = ev.getX();
  46. if (Math.abs(oldX - newX) < sens) {
  47. onItemClickListener.onItemClick((getRealItem()));
  48. }
  49. oldX = 0;
  50. newX = 0;
  51. break;
  52. }
  53. }
  54. return super.onTouchEvent(ev);
  55. } else
  56. return false;
  57. }
  58. @Override
  59. public boolean onInterceptTouchEvent(MotionEvent ev) {
  60. if (isCanScroll)
  61. return super.onInterceptTouchEvent(ev);
  62. else
  63. return false;
  64. }
  65. public CBPageAdapter getAdapter() {
  66. return mAdapter;
  67. }
  68. public int getRealItem() {
  69. return mAdapter != null ? mAdapter.toRealPosition(super.getCurrentItem()) : 0;
  70. }
  71. @Override
  72. public void setOnPageChangeListener(OnPageChangeListener listener) {
  73. mOuterPageChangeListener = listener;
  74. }
  75. public CBLoopViewPager(Context context) {
  76. super(context);
  77. init();
  78. }
  79. public CBLoopViewPager(Context context, AttributeSet attrs) {
  80. super(context, attrs);
  81. init();
  82. }
  83. private void init() {
  84. super.setOnPageChangeListener(onPageChangeListener);
  85. }
  86. private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {
  87. private float mPreviousPosition = -1;
  88. @Override
  89. public void onPageSelected(int position) {
  90. int realPosition = mAdapter.toRealPosition(position);
  91. if (mPreviousPosition != realPosition) {
  92. mPreviousPosition = realPosition;
  93. if (mOuterPageChangeListener != null) {
  94. mOuterPageChangeListener.onPageSelected(realPosition);
  95. }
  96. }
  97. }
  98. @Override
  99. public void onPageScrolled(int position, float positionOffset,
  100. int positionOffsetPixels) {
  101. int realPosition = position;
  102. if (mOuterPageChangeListener != null) {
  103. if (realPosition != mAdapter.getRealCount() - 1) {
  104. mOuterPageChangeListener.onPageScrolled(realPosition,
  105. positionOffset, positionOffsetPixels);
  106. } else {
  107. if (positionOffset > .5) {
  108. mOuterPageChangeListener.onPageScrolled(0, 0, 0);
  109. } else {
  110. mOuterPageChangeListener.onPageScrolled(realPosition,
  111. 0, 0);
  112. }
  113. }
  114. }
  115. }
  116. @Override
  117. public void onPageScrollStateChanged(int state) {
  118. if (mOuterPageChangeListener != null) {
  119. mOuterPageChangeListener.onPageScrollStateChanged(state);
  120. }
  121. }
  122. };
  123. public boolean isCanLoop() {
  124. return canLoop;
  125. }
  126. public void setCanLoop(boolean canLoop) {
  127. this.canLoop = canLoop;
  128. if (canLoop == false) {
  129. setCurrentItem(getRealItem(), false);
  130. }
  131. if (mAdapter == null) return;
  132. mAdapter.setCanLoop(canLoop);
  133. mAdapter.notifyDataSetChanged();
  134. }
  135. public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
  136. this.onItemClickListener = onItemClickListener;
  137. }
  138. }