package com.yidianling.dynamic.adapter; import android.content.Context; import android.content.res.TypedArray; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import com.yidianling.dynamic.R; /** * 懒加载viewPager * Created by xiongyu on 2017/3/27. */ public class LazyViewPager extends ViewPager { private static final float DEFAULT_OFFSET = 0.5f; private LazyPagerAdapter mLazyPagerAdapter; private float mInitLazyItemOffset = DEFAULT_OFFSET; public LazyViewPager(Context context) { super(context); } public LazyViewPager(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LazyViewPager); setInitLazyItemOffset(a.getFloat(R.styleable.LazyViewPager_init_lazy_item_offset, DEFAULT_OFFSET)); a.recycle(); } /** * change the initLazyItemOffset * @param initLazyItemOffset set mInitLazyItemOffset if {@code 0 < initLazyItemOffset <= 1} */ public void setInitLazyItemOffset(float initLazyItemOffset) { if (initLazyItemOffset > 0 && initLazyItemOffset <= 1) { mInitLazyItemOffset = initLazyItemOffset; } } @Override public void setAdapter(PagerAdapter adapter) { super.setAdapter(adapter); mLazyPagerAdapter = adapter != null && adapter instanceof LazyPagerAdapter ? (LazyPagerAdapter) adapter : null; } @Override protected void onPageScrolled(int position, float offset, int offsetPixels) { if (mLazyPagerAdapter != null) { if (getCurrentItem() == position) { int lazyPosition = position + 1; if (offset >= mInitLazyItemOffset && mLazyPagerAdapter.isLazyItem(lazyPosition)) { mLazyPagerAdapter.startUpdate(this); mLazyPagerAdapter.addLazyItem(this, lazyPosition); mLazyPagerAdapter.finishUpdate(this); } } else if (getCurrentItem() > position) { int lazyPosition = position; if (1 - offset >= mInitLazyItemOffset && mLazyPagerAdapter.isLazyItem(lazyPosition)) { mLazyPagerAdapter.startUpdate(this); mLazyPagerAdapter.addLazyItem(this, lazyPosition); mLazyPagerAdapter.finishUpdate(this); } } } super.onPageScrolled(position, offset, offsetPixels); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int curPosition; switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: curPosition = this.getCurrentItem(); int count = this.getAdapter().getCount(); // Log.i(TAG, "curPosition:=" +curPosition); // 当当前页面在最后一页和第0页的时候,由父亲拦截触摸事件 if (curPosition == count - 1|| curPosition==0) { getParent().requestDisallowInterceptTouchEvent(false); } else {//其他情况,由孩子拦截触摸事件 getParent().requestDisallowInterceptTouchEvent(true); } } return super.dispatchTouchEvent(ev); } }