1. 程式人生 > >Android 自定義可自動擴大縮小的ViewPager

Android 自定義可自動擴大縮小的ViewPager

前些天看到蘑菇街的主頁上有一個效果 左右滑動照片,控制元件可以隨著照片的大小放大縮小 於是就自己試著實現了以下

我是使用ViewPager實現的 在其基礎上進行了簡單的改造。
程式碼如下:

public class ScaleViewPager extends ViewPager {

    interface ScalePagerChangedListener {
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);

        public
void onPageSelected(int position); public void onPageScrollStateChanged(int state); } public static class ItemSize { int width; int height; public ItemSize(int width, int height) { this.height = height; this.width = width; } } private
int itemCount; private OnPageChangeListener mListener; private ScalePagerChangedListener mNewListener; private List<ItemSize> itemSizes; private Context ctx; public List<ItemSize> getItemSizes() { return itemSizes; } public void setItemSizes(List<ItemSize> itemSizes) { this
.itemSizes = itemSizes; initView(getContext()); } public ScaleViewPager(Context context) { super(context); } public ScaleViewPager(Context context, AttributeSet attrs) { super(context, attrs); } private void initView(Context context) { final ViewWrapper viewWrapper = new ViewWrapper(this); mListener = new OnPageChangeListener() { int curPos = -1; int ppp = 0; int leftPos, rightPos; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (itemSizes != null) { itemCount = itemSizes.size(); } /* 需要獲取 當前的 大小 和 下一個要滑動到的大小 */ if (curPos == -1) { curPos = position; //當前的位置 } leftPos = position; rightPos = position + 1; if (rightPos > itemCount - 1) { rightPos = position; } // 也就是說 是從 left 到 right這兩個佈局的變化 if (curPos == leftPos) { //表示手指向左滑 int leftH = itemSizes.get(leftPos).height, rightH = itemSizes.get(rightPos).height; int des = rightH - leftH; viewWrapper.setHeight((int) (leftH + positionOffset * des)); } else if (curPos == rightPos) { //表示手指向右滑 int leftH = itemSizes.get(leftPos).height, rightH = itemSizes.get(rightPos).height; int des = leftH - rightH; viewWrapper.setHeight((int) (rightH + (1 - positionOffset) * des)); }else{ } if (mNewListener != null) { mNewListener.onPageScrolled(position, positionOffset, positionOffsetPixels); } } @Override public void onPageSelected(int position) { ppp = position; if (mNewListener != null) { mNewListener.onPageSelected(position); } } @Override public void onPageScrollStateChanged(int state) { if (state == 0||state==2) { curPos = ppp; } if (mNewListener != null) { mNewListener.onPageScrollStateChanged(state); } } }; addOnPageChangeListener(mListener); } public void addScalePagerChangedListener(ScalePagerChangedListener listener) { this.mNewListener = listener; } @Override public void addOnPageChangeListener(OnPageChangeListener listener) { super.addOnPageChangeListener(listener); } public static class ViewWrapper { private View mTarget; public ViewWrapper(View mTarget) { this.mTarget = mTarget; } public int getHeight() { return mTarget.getLayoutParams().height; } public void setHeight(int height) { mTarget.getLayoutParams().height = height; mTarget.requestLayout(); } } }

使用的方法 很簡單 ,可按照正常的ViewPager一樣使用 ,如果想要開啟可伸縮的功能,需要做的僅僅是setItemSizes(),如果想監聽滑動改變事件,請使用 addScalePageChangedListener 這樣 就可以實現了

實現的原理:
原理非常簡單 僅僅是給原本的ViewPager新增 一個 PageChangedListener 然後根據其滑動的規律判斷出當前要過渡的page是哪個,然後根據傳入的ItemSize 和 滑動的比例 改變ViewPager的大小即可