Android 自定義可自動擴大縮小的ViewPager
阿新 • • 發佈:2019-01-23
前些天看到蘑菇街的主頁上有一個效果 左右滑動照片,控制元件可以隨著照片的大小放大縮小 於是就自己試著實現了以下
我是使用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的大小即可