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的主要内容,如果未能解决你的问题,请参考以下文章
带有旋转,放大,缩小和移动在android中的自定义textview?
Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控缩放