最近项目需要做一个类似Gallery画廊效果的功能,因每个页面布局控件比较多,所以就想到用viewpager+fragment的效果实现。效果如下图:
Screenshot_20190625-132722.jpg
1设置clipChildren属性
这个属性是我们平时很少用到的,但很有用,特别是做动画的时候。android:clipChildren默认为true,其作用“是否允许子View超出父View的范围”。在viewpager里设置为true时,超出当前页面的左右页面不会被显示,会用空白代替。反之为false时,超出当前页面的左右页面可以正常显示
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:layerType="software"
android:id="@+id/view_pager_container">
<include layout="@layout/layout_title"/>
<android.support.v4.view.ViewPager
android:id="@+id/sign_viewpager"
android:layout_below="@+id/title_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:clipChildren="false">
</android.support.v4.view.ViewPager>
</RelativeLayout>
2 设置左右页面缓存
viewPager.setOffscreenPageLimit(3);
要显示左右两个子页面,最少缓存3个,不建议太多,太会加大内存消耗。
3 设置子页面左右的间距
除了这个页面设置,同时要在布局文件设置 android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
viewPager.setPageMargin(80);
4 Adapter实现
public class SignDetailPagerAdapter extends FragmentPagerAdapter {
public SignDetailPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
String bean = data.get(position);
return SignDetailFragment.newInstance(bean);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
SignDetailFragment fragment = (SignDetailFragment) super.instantiateItem(container, position);
String bean = data.get(position);
fragment.updateArguments(bean);
return fragment;
}
}