ViewPager与PagerAdapter

来源:互联网 发布:淘宝的亚马逊旗舰店 编辑:程序博客网 时间:2024/06/01 08:54

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无响应。









0 0