| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- package com.bigkoo.convenientbanner.view;
- import android.content.Context;
- import androidx.viewpager.widget.PagerAdapter;
- import androidx.viewpager.widget.ViewPager;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import com.bigkoo.convenientbanner.adapter.CBPageAdapter;
- import com.bigkoo.convenientbanner.listener.OnItemClickListener;
- public class CBLoopViewPager extends ViewPager {
- OnPageChangeListener mOuterPageChangeListener;
- private OnItemClickListener onItemClickListener;
- private CBPageAdapter mAdapter;
- private boolean isCanScroll = true;
- private boolean canLoop = true;
- public void setAdapter(PagerAdapter adapter, boolean canLoop) {
- mAdapter = (CBPageAdapter) adapter;
- mAdapter.setCanLoop(canLoop);
- mAdapter.setViewPager(this);
- super.setAdapter(mAdapter);
- setCurrentItem(getFristItem(), false);
- }
- public int getFristItem() {
- return canLoop ? mAdapter.getRealCount() : 0;
- }
- public int getLastItem() {
- return mAdapter.getRealCount() - 1;
- }
- public boolean isCanScroll() {
- return isCanScroll;
- }
- public void setCanScroll(boolean isCanScroll) {
- this.isCanScroll = isCanScroll;
- }
- private float oldX = 0, newX = 0;
- private static final float sens = 5;
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- if (isCanScroll) {
- if (onItemClickListener != null) {
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN:
- oldX = ev.getX();
- break;
- case MotionEvent.ACTION_UP:
- newX = ev.getX();
- if (Math.abs(oldX - newX) < sens) {
- onItemClickListener.onItemClick((getRealItem()));
- }
- oldX = 0;
- newX = 0;
- break;
- }
- }
- return super.onTouchEvent(ev);
- } else
- return false;
- }
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (isCanScroll)
- return super.onInterceptTouchEvent(ev);
- else
- return false;
- }
- public CBPageAdapter getAdapter() {
- return mAdapter;
- }
- public int getRealItem() {
- return mAdapter != null ? mAdapter.toRealPosition(super.getCurrentItem()) : 0;
- }
- @Override
- public void setOnPageChangeListener(OnPageChangeListener listener) {
- mOuterPageChangeListener = listener;
- }
- public CBLoopViewPager(Context context) {
- super(context);
- init();
- }
- public CBLoopViewPager(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- private void init() {
- super.setOnPageChangeListener(onPageChangeListener);
- }
- private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {
- private float mPreviousPosition = -1;
- @Override
- public void onPageSelected(int position) {
- int realPosition = mAdapter.toRealPosition(position);
- if (mPreviousPosition != realPosition) {
- mPreviousPosition = realPosition;
- if (mOuterPageChangeListener != null) {
- mOuterPageChangeListener.onPageSelected(realPosition);
- }
- }
- }
- @Override
- public void onPageScrolled(int position, float positionOffset,
- int positionOffsetPixels) {
- int realPosition = position;
- if (mOuterPageChangeListener != null) {
- if (realPosition != mAdapter.getRealCount() - 1) {
- mOuterPageChangeListener.onPageScrolled(realPosition,
- positionOffset, positionOffsetPixels);
- } else {
- if (positionOffset > .5) {
- mOuterPageChangeListener.onPageScrolled(0, 0, 0);
- } else {
- mOuterPageChangeListener.onPageScrolled(realPosition,
- 0, 0);
- }
- }
- }
- }
- @Override
- public void onPageScrollStateChanged(int state) {
- if (mOuterPageChangeListener != null) {
- mOuterPageChangeListener.onPageScrollStateChanged(state);
- }
- }
- };
- public boolean isCanLoop() {
- return canLoop;
- }
- public void setCanLoop(boolean canLoop) {
- this.canLoop = canLoop;
- if (canLoop == false) {
- setCurrentItem(getRealItem(), false);
- }
- if (mAdapter == null) return;
- mAdapter.setCanLoop(canLoop);
- mAdapter.notifyDataSetChanged();
- }
- public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
- this.onItemClickListener = onItemClickListener;
- }
- }
|