zoukankan      html  css  js  c++  java
  • 【转】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 }}

  • 相关阅读:
    c++11强制转化类型
    关于parent指针以及对话框属性
    关于connect函数(Qt)
    lambda表达式
    学习过程中要注意的一些问题
    自动类型转换
    gakki
    排序算法(2)——简单选择排序和直接插入排序
    [Leetcode]414. Third Maximum Number
    [Leetcode]283. Move Zeroes
  • 原文地址:https://www.cnblogs.com/neillee/p/7867460.html
Copyright © 2011-2022 走看看