ViewPager轮播图实现一屏显示多页的效果,如图所示
接下来具体介绍咋个实现
1.首先我们要了解一个属性:android:clipChildren;这个属性表示是否限制子View在其范围内,默认是true,即限制子View在其范围内,所以很明显,当前页要显示前后两页的内容,就要在XML文件中将其父布局的这个属性值设置为false,当然也可以在代码中设置:setClipChildren(false)。
2.通过设置 ViewPager 的 layout_marginLeft 和 layout_marginLeft 两个属性以及通过setPageMargin(int marginPixls)方法,可以设置其他页面(非当前页面)的显示大小,setPageMargin(int marginPixls)方法的作用是设置两个page的间距。
需要注意:
setClipChildren(false)在3.0以上版本,开启了硬件加速后将不能正常生效,需要将其父布局设置成软件加速。设置软件加速的方法是setLayerType(View.LAYER_TYPE_SOFTWARE, null); 也可以在布局文件中添加 android:layerType=”software”。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="150dp"
android:clipChildren="false"
android:layerType="software">
<android.support.v4.view.ViewPager
android:layout_marginTop="10dp"
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
/>
</RelativeLayout>
Activity中代码:
private void addImageView() {
//配置轮播图ViewPager
mAdapter = new MyPagerAdapter(mItems, mcontext);
mViewPager.setAdapter(mAdapter);
mViewPager.setOffscreenPageLimit(3);
mViewPager.setPageTransformer(true,new Transformer()); //切换动画,左右两边页面高度低
mViewPager.setPageMargin(DensityUtils.dip2px(10f));
}
private class Transformer implements ViewPager.PageTransformer {
private final float MIN_SCALE = 0.8f;
@Override
public void transformPage(View page, float position) {
if(position >= -1 && position <= 1) {
page.setScaleY(1.0f - Math.abs(position) * (1 - MIN_SCALE));
} else {
page.setScaleY(MIN_SCALE);
}
}
}