ViewPager与PagerAdapter

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值