import android.support.v4.view.ViewPager.PageTransformer;import android.view.View;/** * created by bruce.zhang */public class BBSPicturePageTransformer implements PageTransformer { private static final float ROTATION_MAX = 10.0f; private static float MIN_SCALE = 0.9f; private static float MIN_ALPHA = 0.7f; private float mRotation; @Override public void transformPage(View view, float position) { int pageWidth = view.getWidth(); if (position < -1) { view.setTranslationX(0); view.setRotation(0); view.setRotation(0); view.setScaleX(1); view.setScaleY(1); view.setAlpha(MIN_ALPHA); } else if (position <= 0) { view.setTranslationX(0); mRotation = (ROTATION_MAX * position); view.setPivotX(view.getMeasuredWidth() * 0.5f); view.setPivotY(view.getMeasuredHeight()); view.setRotation(mRotation); float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); float alphaFactor = MIN_ALPHA + (1 - MIN_ALPHA) * (1 - Math.abs(position)); view.setAlpha(alphaFactor); } else if (position <= 1) { view.setTranslationX(pageWidth * -position); view.setRotation(0); view.setScaleX(1); view.setScaleY(1); view.setAlpha(1); } else { view.setTranslationX(0); view.setRotation(0); view.setScaleX(1); view.setScaleY(1); view.setAlpha(1); } }}
import android.content.Context;import android.os.Handler;import android.os.Message;import android.support.v4.view.MotionEventCompat;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewConfigurationCompat;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewConfiguration;import android.view.ViewGroup;import android.view.animation.Interpolator;import com.kidswant.ss.R;import com.kidswant.ss.ui.bbs.model.PicItem;import java.lang.ref.WeakReference;import java.lang.reflect.Field;import java.util.ArrayList;/** * Created by bruce.zhang on 2015/12/19. */public class BBSPictureViewPager extends ViewPager { private static BBSPicturePageTransformer mPageTransformer = new BBSPicturePageTransformer(); private BBSPicturePageAdapter mAdapter; private int mPadding = 0; private ViewPagerHandler mHandler = new ViewPagerHandler(this); private class ViewPagerHandler extends Handler { private final WeakReferencemService; ViewPagerHandler(BBSPictureViewPager service) { super(); mService = new WeakReference (service); } @SuppressWarnings("unchecked") @Override public void handleMessage(Message msg) { BBSPictureViewPager service = mService.get(); if (service == null ) { return; } if(msg.what == 898989) { int pageIndex = msg.arg1; setCurrentItem(pageIndex, false); } } }; public BBSPictureViewPager(Context context) { super(context); init(); } public BBSPictureViewPager(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { setOffscreenPageLimit(2); setPageTransformer(true, mPageTransformer); int margin = getResources().getDimensionPixelSize(R.dimen.common_horizontal_margin); mPadding = 2 * margin; try { Field mScroller; mScroller = ViewPager.class.getDeclaredField("mScroller"); mScroller.setAccessible(true); Field interpolator = ViewPager.class.getDeclaredField("sInterpolator"); interpolator.setAccessible(true); FixedSpeedScroller scroller = new FixedSpeedScroller(getContext(), (Interpolator) interpolator.get(null)); // scroller.setFixedDuration(5000); mScroller.set(this, scroller); } catch (NoSuchFieldException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } final ViewConfiguration configuration = ViewConfiguration.get(getContext()); mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int state) { } public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mHandler.removeMessages(898989); if(mAdapter.getCount() <= 1) return; int pageIndex = position; if (position == 0) { // 当视图在第一个时,将页面号设置为图片的最后一张。 pageIndex = mAdapter.getCount() - 2; } else if (position == mAdapter.getCount() - 1) { // 当视图在最后一个是,将页面号设置为图片的第一张。 pageIndex = 1; } if (position != pageIndex) { mHandler.sendMessageDelayed(mHandler.obtainMessage(898989, pageIndex, 0, 0), 400); } } }); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = width - mPadding; super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); } private float mLastMotionX; private float mLastMotionY; private boolean mIsBeingDragged; private int mTouchSlop; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean intercept = super.onInterceptTouchEvent(ev); if(!intercept) { final int action = ev.getAction() & MotionEventCompat.ACTION_MASK; if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { mIsBeingDragged = false; } switch (action) { case MotionEvent.ACTION_MOVE: { final float x = ev.getX(); final float xDiff = Math.abs(x - mLastMotionX); final float y = ev.getY(); final float yDiff = Math.abs(y - ev.getY()); mIsBeingDragged = xDiff > mTouchSlop || yDiff > mTouchSlop; break; } case MotionEvent.ACTION_DOWN: { mIsBeingDragged = false; mLastMotionX = ev.getX(); mLastMotionY = ev.getY(); break; } } intercept = mIsBeingDragged; } return intercept; } public void setData(LayoutInflater inflater, int coverWidth, ArrayList picItems, View.OnClickListener onClickListener, int currentItem) { setData(inflater, coverWidth, picItems, onClickListener, onClickListener, currentItem); } public void setData(LayoutInflater inflater, int coverWidth, ArrayList picItems, View.OnClickListener onClickListener, View.OnClickListener onImageTagClickListener, int currentItem) { View view1 = ((ViewGroup)getParent()).findViewById(R.id.img_multi_hint1); View view2 = ((ViewGroup)getParent()).findViewById(R.id.img_multi_hint2); int shadowCount = (picItems == null || picItems.size() <= 1) ? 0 : (picItems.size() == 2 ? 1: 2); if(view1 != null && view2 != null) { if(shadowCount == 0) { view1.setVisibility(View.GONE); view2.setVisibility(View.GONE); } else if(shadowCount == 1) { view1.setVisibility(View.VISIBLE); view2.setVisibility(View.GONE); } else { view1.setVisibility(View.VISIBLE); view2.setVisibility(View.VISIBLE); } } PagerAdapter adapter = getAdapter(); if(adapter == null) { mAdapter = new BBSPicturePageAdapter(inflater, coverWidth); } mAdapter.setOnItemClickListener(onClickListener); mAdapter.setOnImageTagClickListener(onImageTagClickListener); mAdapter.setDatas(picItems); setAdapter(mAdapter); if(currentItem == 0) { currentItem = 1; } currentItem = Math.min(currentItem, mAdapter.getCount() - 1); setCurrentItem(currentItem, false); }}
import android.support.v4.view.PagerAdapter;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.kidswant.ss.R;import com.kidswant.ss.ui.bbs.fragment.ImageTagDragableLayout;import com.kidswant.ss.ui.bbs.model.PicItem;import com.kidswant.ss.ui.bbs.service.BBSUIUtil;import com.kidswant.ss.util.ImageLoaderUtil;import java.util.ArrayList;/** * created by bruce.zhang */public class BBSPicturePageAdapter extends PagerAdapter { private LayoutInflater mInflater; private SparseArraymViews; private ArrayList mDatas = new ArrayList (); private int mCoverWidth; private View.OnClickListener mOnClickListener; private View.OnClickListener mOnImageTagClickListener = null; BBSPicturePageAdapter(LayoutInflater inflater, int coverWidth) { mInflater = inflater; mViews = new SparseArray (); mCoverWidth = coverWidth; } public void setOnItemClickListener(View.OnClickListener onClickListener) { mOnClickListener = onClickListener; } public void setOnImageTagClickListener(View.OnClickListener onClickListener) { mOnImageTagClickListener = onClickListener; } public void setDatas(ArrayList datas) { mDatas.clear(); if(datas != null) { mDatas.addAll(datas); } notifyDataSetChanged(); } @Override public int getCount() { if(mDatas == null || mDatas.isEmpty()) { return 0; } else if(mDatas.size() == 1) { return 1; } else { return mDatas.size() + 2; } } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { View view = mViews.get(position); if(view != null) { container.removeView(view); } else { container.removeView((View) object); } } @Override public Object instantiateItem(ViewGroup container, int position) { View view = mViews.get(position); if(view == null) { view = mInflater.inflate(R.layout.bbs_picture_item, container, false); mViews.put(position, view); } PicItem picItem = null; if(mDatas.size() == 1) { picItem = mDatas.get(position); } else { if (position == 0) { picItem = mDatas.get(mDatas.size() - 1); } else if (position == (getCount() - 1)) { picItem = mDatas.get(0); } else { picItem = mDatas.get(position - 1); } } View frame = view.findViewById(R.id.fl_image_tag); int padding = mDatas.size() <= 1 ? 0 : 1; frame.setPadding(padding, padding, padding, padding); setCover((ImageTagDragableLayout) view.findViewById(R.id.rl_image_tag), picItem, padding); view.setId(position); container.addView(view); return view; }}