在安卓开发中使用到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,自定义一个缩放的控制器。