【转】ViewPager 一屏显示多个子页面

一、概述

项目中遇到一个需求:ViewPager 一屏显示多个子页面。因为之前没有做过这样的界面,所以经历了些许小插曲,特以记之!

主要内容来自: http://blog.csdn.net/JM_beizi/article/details/51297605

二、方案

通过查询资料,发现有两种解决方案:

  • 重写 PagerAdapter.getPageWidth(int position) 方法
  • XML中设置 android:clipChildren="false" 这个属性

三、方案一详情

PagerAdapter相关源码:

	/**
     * Returns the proportional width of a given page as a percentage of the
     * ViewPager's measured width from (0.f-1.f]
     *
     * @param position The position of the page requested
     * @return Proportional width for the given page position
     */
    public float getPageWidth(int position) {
        return 1.f;
    }

四、方案二详情

1. 首先,对 XML 属性进行配置

配置 ViewPager 和其父布局的 android:clipChildren 属性为 false

android:clipChildren 表示是否限制子 View 在其范围内,默认为 true。

代码中通过 setClipChildren(false) 方法设置。

特别注意:

  1. setClipChildren(false) 在 3.0 以上版本中,开启了硬件加速后将不能正常工作,所以需要将其设置为软件加速。设置软硬件加速使用 setLayerType(View.LAYER_TYPE_SOFTWARE, null); 也可以在布局文件中添加 android:layerType="software"
  2. 通过设置 ViewPager 的 layout_marginLeftlayout_marginLeft 两个属性,可以设置其他页面(非当前页面)的显示大小
<RelativeLayout
    android:id="@+id/viewPager_container"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:background="@android:color/white"
    android:clipChildren="false"
    android:layerType="software">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="110dp"
        android:layout_marginRight="110dp"
        android:clipChildren="false" />
</RelativeLayout>

2. 其次,设置 item 的缓存数目。

mViewPager.setOffscreenPageLimit(2); // 2 表示除了当前页面,再缓存其他两个页面

3. 最后,设置页与页之间的间距

mViewPager.setPageMargin(int marginPixls); // setPageMargin表示设置page之间的间距

4. 注意:

如下事项来自参考文章的评论区:

  • 该方案如果配合无限循环的话,有 bug 会崩掉,所以需要自己处理!
  • 此法实现的 ViewPager 设置 Item 点击事件有问题!

使用过程中,第二个问题未重现!

此文在我的 Github Pages 上同步发布,地址为:{{ title }}

posted @ 2017-11-20 17:44  NeilLee  阅读(3413)  评论(0编辑  收藏  举报