自定义布局,使Viewpager显示上一页的一部分和下一页的一部分

Xml中的使用:(使用pagerContainer嵌套viewpager实现)
<com.example.testsurrondviewpager.PagerContainer
        android:id="@+id/pager_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#CCC">
        <com.example.testsurrondviewpager.MyRatioViewPager
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />
    </com.example.testsurrondviewpager.PagerContainer> 

PagerContainer:
 
  
package com.example.testsurrondviewpager;
 
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
import android.content.Context;
import android.graphics.Paint;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.EdgeEffectCompat;
import android.util.AttributeSet;
import android.widget.FrameLayout;
public class PagerContainer extends FrameLayout implements ViewPager.OnPageChangeListener {
 
    private ViewPager mPager;
    boolean mNeedsRedraw = false;
    private EdgeEffectCompat leftEdge;
    private EdgeEffectCompat rightEdge;
 
    public PagerContainer(Context context) {
        super(context);
        init();
    }
 
    public PagerContainer(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
 
    public PagerContainer(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
 
    private void init() {
        setClipChildren(false);
        try {
            Method setLayerTypeMethod = this.getClass().getMethod("setLayerType", new Class[] {int.class, Paint.class});
            setLayerTypeMethod.invoke(this, new Object[] {LAYER_TYPE_SOFTWARE, null});
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
 
    @Override
    protected void onFinishInflate() {
        try {
            mPager = (ViewPager) getChildAt(0);
            mPager.setOnPageChangeListener(this);
                Field leftEdgeField = mPager.getClass().getSuperclass().getDeclaredField("mLeftEdge");
                Field rightEdgeField = mPager.getClass().getSuperclass().getDeclaredField("mRightEdge");
                if (leftEdgeField != null && rightEdgeField != null) {
                  leftEdgeField.setAccessible(true);
                  rightEdgeField.setAccessible(true);
                  leftEdge = (EdgeEffectCompat) leftEdgeField.get(mPager);
                  rightEdge = (EdgeEffectCompat) rightEdgeField.get(mPager);
                }
        } catch (Exception e) {
        e.printStackTrace();
        }
    }
 
    public ViewPager getViewPager() {
        return mPager;
    }
 
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if (mNeedsRedraw) invalidate();
        if (leftEdge != null && rightEdge != null) {
            leftEdge.finish();
            rightEdge.finish();
            leftEdge.setSize(0, 0);
            rightEdge.setSize(0, 0);
          }
    }
 
    @Override
    public void onPageSelected(int position) { }
 
    @Override
    public void onPageScrollStateChanged(int state) {
        mNeedsRedraw = (state != ViewPager.SCROLL_STATE_IDLE);
    }
}
MyRatioViewpager:
 
  
package com.example.testsurrondviewpager;
 
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
 
public class MyRatioViewPager extends ViewPager{
 
public MyRatioViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
 
public MyRatioViewPager(Context context) {
super(context);
}
 
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int size = (int) (MeasureSpec.getSize(widthMeasureSpec)/1.5);//这里可以设置viewpager两侧显示的大小
int mode = MeasureSpec.getMode(widthMeasureSpec);
widthMeasureSpec = MeasureSpec.makeMeasureSpec(size, mode);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
发布了24 篇原创文章 · 获赞 5 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/g707175425/article/details/44961087