PagerAdapter
常用方法
getPageWidth():获取子View占ViewPager的宽度比。默认时该方法返回1,所以ViewPager每一次只可以显示一个完整子View。可以将方法返回值调用,就可以一次性显示多个。
ViewPager
常用方法
setPageMargin():设置各Page之间的margin。
setOffscreenLimit():设置每一次缓存的page数。
效果
常见的效果如下:
居中显示一个page,但两边仍旧保留上下page的一部分。
其实现思路是:将ViewPager居中,但不限制子View只显示在ViewPager的范围内——利用clipChildren属性。如布局为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:clipChildren="false"
tools:context="com.sogle.app1.MainActivity">
<android.support.v4.view.ViewPager
android:clipChildren="false"
android:id="@+id/vp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
父布局与ViewPager都设置了clipChildren为false,这样超出viewpager的部分就会显示出来。而ViewPager本身会将子View进行横向排列,所以超出显示部分(即当前View左右两边的View)依旧会显示出来,这便形成了上述的效果。
该效果时,由于左右两边显示部分并不属于ViewPager,所以左右两边显示部分的touch事件ViewPager是接受不到的,为此可以重写ViewPager的父布局,将它的所有touch事件直接传递给viewPager执行。
对应的java代码为:
final ViewPager vp = (ViewPager) findViewById(R.id.vp);
vp.setPageMargin(20);
vp.setOffscreenPageLimit(2);
findViewById(R.id.activity_main).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return vp.dispatchTouchEvent(motionEvent);
}
});
首先设置viewpager预加载个数为2,保证一次显示的三个page都已预加载完成。
再者,将viewpager的父view的点击事件全部交由viewpager自己处理,其目的是为了在viewpager两边的touch事件也能由viewpager处理,防止触摸两边时viewpager无响应。