Android 自定义可自动扩大缩小的ViewPager

来源:互联网 发布:网吧软件管理 编辑:程序博客网 时间:2024/05/20 15:58

前些天看到蘑菇街的主页上有一个效果 左右滑动照片,控件可以随着照片的大小放大缩小 于是就自己试着实现了以下

我是使用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的大小即可

0 0
原创粉丝点击