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

Posted 潇潇微雨up

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的大小即可

以上是关于Android 自定义可自动扩大缩小的ViewPager的主要内容,如果未能解决你的问题,请参考以下文章

整数转换(缩小,扩大),未定义的行为

Fargate 扩大规模始终如一,但缩小规模并不始终如一

带有旋转,放大,缩小和移动在android中的自定义textview?

Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控缩放

Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控缩放

Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置