【转】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)
方法设置。
特别注意:
setClipChildren(false)
在 3.0 以上版本中,开启了硬件加速后将不能正常工作,所以需要将其设置为软件加速。设置软硬件加速使用setLayerType(View.LAYER_TYPE_SOFTWARE, null)
; 也可以在布局文件中添加android:layerType="software"
- 通过设置 ViewPager 的
layout_marginLeft
和layout_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 }}