package com.base.util.helper; import android.support.design.widget.CollapsingToolbarLayout; import android.support.v4.view.ViewPager; import android.widget.ImageView; /** * ViewPager滑动页面监听 * <p/> * Created by wangchenlong on 15/11/9. */ public class PagerChangeListener implements ViewPager.OnPageChangeListener { private ImageAnimator mImageAnimator; private int mCurrentPosition; private int mFinalPosition; private boolean mIsScrolling = false; public PagerChangeListener(ImageAnimator imageAnimator) { mImageAnimator = imageAnimator; } public static PagerChangeListener newInstance(CollapsingToolbarLayout collapsingToolbar, ImageView originImage, ImageView outgoingImage) { ImageAnimator imageAnimator = new ImageAnimator(collapsingToolbar, originImage, outgoingImage); return new PagerChangeListener(imageAnimator); } /** * 滑动监听 * * @param position 当前位置 * @param positionOffset 偏移[当前值+-1] * @param positionOffsetPixels 偏移像素 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //Log.e("DEBUG-WCL", "position: " + position + ", positionOffset: " + positionOffset); // 以前滑动, 现在终止 if (isFinishedScrolling(position, positionOffset)) { finishScroll(position); } // 判断前后滑动 if (isStartingScrollToPrevious(position, positionOffset)) { startScroll(position); } else if (isStartingScrollToNext(position, positionOffset)) { startScroll(position + 1); // 向后滚动需要加1 } // 向后滚动 if (isScrollingToNext(position, positionOffset)) { mImageAnimator.forward(position, positionOffset); } else if (isScrollingToPrevious(position, positionOffset)) { // 向前滚动 mImageAnimator.backwards(position, positionOffset); } } /** * 终止滑动 * 滑动 && [偏移是0&&滑动终点] || 动画之中 * * @param position 位置 * @param positionOffset 偏移量 * @return 终止滑动 */ public boolean isFinishedScrolling(int position, float positionOffset) { return mIsScrolling && (positionOffset == 0f && position == mFinalPosition) || !mImageAnimator.isWithin(position); } /** * 从静止到开始滑动, 下一个 * 未滑动 && 位置是当前位置 && 偏移量不是0 * * @param position 位置 * @param positionOffset 偏移量 * @return 是否 */ private boolean isStartingScrollToNext(int position, float positionOffset) { return !mIsScrolling && position == mCurrentPosition && positionOffset != 0f; } /** * 从静止到开始滑动, 前一个[position会-1] * * @param position 位置 * @param positionOffset 偏移量 * @return 是否 */ private boolean isStartingScrollToPrevious(int position, float positionOffset) { return !mIsScrolling && position != mCurrentPosition && positionOffset != 0f; } /** * 开始滚动, 向后 * * @param position 位置 * @param positionOffset 偏移 * @return 是否 */ private boolean isScrollingToNext(int position, float positionOffset) { return mIsScrolling && position == mCurrentPosition && positionOffset != 0f; } /** * 开始滚动, 向前 * * @param position 位置 * @param positionOffset 偏移 * @return 是否 */ private boolean isScrollingToPrevious(int position, float positionOffset) { return mIsScrolling && position != mCurrentPosition && positionOffset != 0f; } /** * 开始滑动 * 滚动开始, 结束位置是position[前滚时position会自动减一], 动画从当前位置到结束位置. * * @param position 滚动结束之后的位置 */ private void startScroll(int position) { mIsScrolling = true; mFinalPosition = position; // 开始滚动动画 mImageAnimator.start(mCurrentPosition, position); } /** * 如果正在滚动, 结束时, 固定position位置, 停止滚动, 调动截止动画 * * @param position 位置 */ private void finishScroll(int position) { if (mIsScrolling) { mCurrentPosition = position; mIsScrolling = false; mImageAnimator.end(position); } } @Override public void onPageScrollStateChanged(int state) { //NO-OP } @Override public void onPageSelected(int position) { if (!mIsScrolling) { mIsScrolling = true; mFinalPosition = position; mImageAnimator.start(mCurrentPosition, position); } } }