一、概述
项目中遇到一个需求:ViewPager 一屏显示多个子页面。因为之前没有做过这样的界面,所以经历了些许小插曲,特以记之!
主要内容来自: http://blog.csdn.net/JM_beizi/article/details/51297605
二、方案
通过查询资料,发现有两种解决方案:
- 重写
PagerAdapter.getPageWidth(int position)
方法 - XML中设置
android:clipChildren="false"
这个属性
三、方案一详情
PagerAdapter相关源码:12345678910/** * 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
两个属性,可以设置其他页面(非当前页面)的显示大小
|
|
2. 其次,设置 item 的缓存数目。
|
|
3. 最后,设置页与页之间的间距
mViewPager.setPageMargin(int marginPixls); // setPageMargin表示设置page之间的间距
4. 注意:
如下事项来自参考文章的评论区:
- 该方案如果配合无限循环的话,有 bug 会崩掉,所以需要自己处理!
- 此法实现的 ViewPager 设置 Item 点击事件有问题!
使用过程中,第二个问题未重现!