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

1、概述

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

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

2、方案

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

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

3、方案一详情

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;
    }

4、方案二详情

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

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

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

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

特别注意:xml

  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之间的间距blog

4. 注意:

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

  • 该方案若是配合无限循环的话,有 bug 会崩掉,因此须要本身处理!
  • 此法实现的 ViewPager 设置 Item 点击事件有问题!

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

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

相关文章
相关标签/搜索