ViewPager设置页面缩放

在安卓开发中使用到ViewPager的地方特别的多,我们需要根据不同的需求设置ViewPager显示的方式。如下面的Viewpager如何实现呢?
在这里插入图片描述

 <android.support.v4.view.ViewPager
            android:id="@+id/vp_easy_view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="@dimen/dp_24"
            android:paddingLeft="@dimen/dp_35"
            android:paddingRight="@dimen/dp_35"/>

设置布局控件的时候需要注意设置ViewPager的左右Padding,要不然当前的界面就会默认填充整个屏幕界面,无法显示左右两边的页面了。
设置好控件之后,我们就可以来设置控件的显示,中间显示的View我们可以自定义,
然后实现一个PagerAdapter,这些都很简单。
要让中间显示的View是三个,而不是一个,最主要的是设置ViewPager的setPageTransformer方法,然后实现一个自定义的ViewPager.PageTransformer。

/**
 * 设置中间放大两边缩小
 */
public class ScalePageTransformer implements ViewPager.PageTransformer {

    public static final float MAX_SCALE = 1.0f;
    public static final float MIN_SCALE = 0.8f;
    private final boolean isFill;

    public ScalePageTransformer(boolean isFill) {
        this.isFill = isFill;
    }

    @Override
    public void transformPage(@NonNull View page, float position) {
        if (position < -1) {
            position = -1;
        } else if (position > 1) {
            position = 1;
        }
        float tempScale = position < 0 ? 1 + position : 1 - position;

        float slope = (MAX_SCALE - MIN_SCALE) / 1;

        float scaleValue = MIN_SCALE + tempScale * slope;
        if (isFill) {
            page.setScaleX(scaleValue);
        }
        page.setScaleY(scaleValue);
    }
}

这里需要注意一下PagerAdapter的实现需要实现getPageWidth方法,改方法是获取当前显示CurrentItem的宽度的方法。

public class HappyJourneyPagerAdapter extends PagerAdapter {

    ArrayList<HappyJourneyPagerView> mPagerViewList;

    public HappyJourneyPagerAdapter(ArrayList<HappyJourneyPagerView> pagerViewList){
        mPagerViewList = pagerViewList;

    }
    @Override
    public int getCount() {
        return mPagerViewList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        container.addView(mPagerViewList.get(position));
        return mPagerViewList.get(position);
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
         container.removeView(mPagerViewList.get(position));
    }

    @Override
    public float getPageWidth(int position) {
        return 0.98f;
    }

最后设置代码如下:


        HappyJourneyPagerAdapter journeyPagerAdapter = new HappyJourneyPagerAdapter(pagerViewList);
        binding.vpEasyViewPager.setAdapter(journeyPagerAdapter);
        binding.vpEasyViewPager.setCurrentItem(2);
        binding.vpEasyViewPager.setPageMargin(DensityUtil.dip2px(getBaseContext(),14));
        binding.vpEasyViewPager.setOffscreenPageLimit(3);
        binding.vpEasyViewPager.setPageMarginDrawable(R.color.white);
        ScalePageTransformer scalePageTransformer = new ScalePageTransformer(false);
        binding.vpEasyViewPager.setPageTransformer(false,scalePageTransformer);

最后我们总结一下: 如果我们想要实现一个左右两边只显示一点点,而且会有缩放效果的ViewPager,.该怎么做呢?
1)在布局设置ViewPager时需要设置左右的Padding,这样才能让其他的Pager显示出来, android:clipChildren=“false” ;android:clipToPadding=“false” 。
2)实现PagerAdapter需要设置getPagerWidth方法来限制显示的Pager的宽度。
3)设置ViewPager的当前显示第二个界面,一屏显示三个界面,界面间隙,最重要的就是设置PagerTransforer,自定义一个缩放的控制器。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值