Android - 更改 viewpager 副页的填充

Android - Change padding for viewpager side pages

我需要为我的 viewpager 创建以下布局:

我正在使用 PageContainer:

public class PagerContainer extends FrameLayout implements ViewPager.OnPageChangeListener{

private ViewPager mPager;
boolean mNeedsRedraw = false;

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()
{
    // Disable clipping of children so non-selected pages are visible
    setClipChildren(false);

    // Child clipping doesn't work with hardware acceleration in Android
    // 3.x/4.x
    // You need to set this value here if using hardware acceleration in an
    // application targeted at these releases.
    setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

@Override
protected void onFinishInflate()
{
    try
    {
        mPager = (ViewPager) getChildAt(0);
        mPager.setOnPageChangeListener(this);
    } catch (Exception e)
    {
        throw new IllegalStateException("The root child of PagerContainer must be a ViewPager");
    }
}

public ViewPager getViewPager()
{
    return mPager;
}

private Point mCenter = new Point();
private Point mInitialTouch = new Point();

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
    mCenter.x = w / 2;
    mCenter.y = h / 2;
}

@Override
public boolean onTouchEvent(MotionEvent ev)
{
    // We capture any touches not already handled by the ViewPager
    // to implement scrolling from a touch outside the pager bounds.
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        mInitialTouch.x = (int) ev.getX();
        mInitialTouch.y = (int) ev.getY();
    default:
        ev.offsetLocation(mCenter.x - mInitialTouch.x, mCenter.y - mInitialTouch.y);
        break;
    }

    return mPager.dispatchTouchEvent(ev);
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
    // Force the container to redraw on scrolling.
    // Without this the outer pages render initially and then stay static
    if (mNeedsRedraw)
        invalidate();
}

@Override
public void onPageSelected(int position)
{}

@Override
public void onPageScrollStateChanged(int state)
{
    mNeedsRedraw = (state != ViewPager.SCROLL_STATE_IDLE);
}

` 并像这样设置:

PagerContainer mContainer = (PagerContainer) mainView.findViewById(R.id.pagerContainer);
    pager = mContainer.getViewPager();
    pager.setOffscreenPageLimit(pagerAdapter.getCount());
    pager.setPageMargin(getPx(20));
    pager.setClipChildren(false);

但是副页与活动页的大小相同。 我试过使用 pager.setPageMargin 但只设置了页边距。

有人可以帮助我吗?

您需要一个 PageTransfomer 来更改页面在中央页面左侧和右侧的比例。当您实现接口时,您将被迫实现

public  void transformPage (View page, float position) {

}

page 是当前ViewPager的页面,而float position是页面相对于分页器当前中心位置的位置。您可能想要的是在位置大于 1 或小于 -1 时更改页面的 scaleX 和 scaleY。例如

public  void transformPage (View page, float position) {
       if (position > 1 || position < -1) {
          ViewCompat.scaleX(page, 0.75f * paget.getWidth());
          ViewCompat.scaleY(page, 0.75f * paget.getHeight());
       } else if (position == 0) {
          ViewCompat.scaleX(page, 1f);
          ViewCompat.scaleY(page, 1f);
       }
}

我没有机会尝试,所以请查看 typo/cast。