关于ViewPager显示两边的item方法,网络上是方法都在ViewPager外包一个Layout,

然后设置ViewPager和外面的Layout的clipChildren="false"。

ViewPager再设置layout_marginLeft,layout_marginRIght,以留出空间来显示两边的item.

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:id="@+id/viewPagerContainer"
 4     android:layout_height="match_parent"
 5     android:background="#EEEEEE"
 6     android:clipChildren="false"
 7     android:orientation="vertical" >
 8
 9     <android.support.v4.view.ViewPager
10         android:id="@+id/viewpage"
11         android:layout_width="match_parent"
12         android:layout_height="match_parent"
13         android:layout_marginLeft="80dp"
14         android:layout_marginRight="80dp"
15         android:clipChildren="false" />
16
17 </LinearLayout>    

这种方法有两个缺点:

1、手指从两边的item滑动时,不能切换page,因为两边的item并不在ViewPager的范围内。

2、在4.2和以下的系统滑动会出现两边的item没有一起滑动(父Layout没有刷新),据说要关闭硬件加速,笔者没试过。

下面介绍另一种方法。

笔者使用的v4包版本是23.3,不保证23.3以下的版本有效

1 <android.support.v4.view.ViewPager
2         android:id="@+id/viewpage"
3         android:layout_width="match_parent"
4         android:layout_height="match_parent"
5         android:paddingLeft="80dp"
6         android:paddingRight="80dp"
7         android:clipToPadding="false"

这里只是把marginLeft和marginRight换成了paddingLeft和paddingRight,clipChildren换成了clipToPadding。

就是这么简单,就解决了第一个方法的两个缺点。

至于为什么,看ViewPager的源码就知道了。

下面是ViewPager的onMeasure里的部分代码:

 1 setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
 2                 getDefaultSize(0, heightMeasureSpec));
 3
 4         final int measuredWidth = getMeasuredWidth();
 5         final int maxGutterSize = measuredWidth / 10;
 6         mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize);
 7
 8         // Children are just made to fill our space.
 9         int childWidthSize = measuredWidth - getPaddingLeft() - getPaddingRight();
10         int childHeightSize = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();  

其中,默认情况下,childWidthSize就是页面item的宽度了,等于ViewPager的宽度减去左右Padding。

我们给ViewPager设置了左右Padding,页面item的宽度就变小了,左右的item也就显示出来了,但要设置ViewPager的clipToPadding=false才行。

另外,设置item的间距,viewPager.setPageMargin(10);

两个ViewPager嵌套时

当两个viewPager嵌套时,正好要显示两边item的viewPager是内层View时,当手指在接近屏幕边缘滑动时,比如,在右边缘左滑来显示内层ViewPager右边的内容时,会发现内层的ViewPager没有切换,而是切换了父ViewPager的页面。

解决方法是:

 1 public static void clearGutterSize(ViewPager viewPager) {
 2     try {
 3         Field field = ViewPager.class.getDeclaredField("mDefaultGutterSize");
 4         field.setAccessible(true);
 5         field.set(viewPager, 0);
 6
 7         viewPager.requestLayout();
 8     } catch (Exception e) {
 9         Log.d("MyViewPager", "#clearGutterSize:", e);
10     }
11 }  

内层和外层两个viewPager都要clearGutterSize

clearGutterSize(parentViewPager)  

clearGutterSize(innerViewPager)  

转自:http://blog.csdn.net/asia_deng/article/details/70176393

转载于:https://www.cnblogs.com/Sharley/p/8532505.html

ViewPager一屏显示多个item,及边缘滑动事件优化相关推荐

  1. ViewPager系列之ViewPager一屏显示多个子页面

    from :http://blog.csdn.net/JM_beizi/article/details/51297605 ViewPager一屏显示多个子页面,常见的有两种形式: 1.当前展示的页面右 ...

  2. ViewPager单页显示3个item

    https://www.cnblogs.com/anni-qianqian/p/6801778.html 转载于:https://www.cnblogs.com/Oldz/p/10283749.htm ...

  3. html表格全屏显示,tableView滑动全屏显示

    今天要分享的一个效果是在一个页面弹出视图展示一个tableview,然后手指滑动tableview时,视图随着tableview偏移量增加而慢慢增加,到达临界时,全屏显示,然后再次向下滑动时,当偏移量 ...

  4. android recyclerview 横向item 宽度,RecyclerView的item宽度不能全屏显示及线性布局与grid布局切换混乱解决方法...

    1.RecyclerView的Item宽度不能全屏显示 出现这种的原因有两种: 1.第一种是在adapter中加载inflater时parent传入为null 2.如果第一种不行,第二种原因就是在Re ...

  5. 设置Dialog全屏显示(转)

    昨天有人问怎样让Dialog全屏显示? 默认的Dialog是不能全屏的. 也就是怎么设置Dialog的Layout都无用的. 有一个地方能够设置. 就是. . . . 看代码直观. 先设置一个styl ...

  6. Android隐藏标题栏,全屏显示

    Android 1.5测试通过 只需在以下代码中的,setCurrentView();之前调用即可 http://hi.baidu.com/wishwingliao/blog/item/38feb71 ...

  7. QT 实现滚屏显示多张漂亮美眉图片(可放大缩小)

    作为新手小白的一些分享....... 其中一部分功能要求显示多张图片,如果图片总高度超过工具窗口的高度就要有滚动条出现,实现滚屏的效果,网上这部分内容少之又少,我就把效果和代码都贴出来供大家参考. 想 ...

  8. 解决 Android APP 启动页白屏问题及如何实现全屏显示

    目录 一.白屏原因分析 二.解决白屏方案 方案一.提供 .png 背景图 方案二.使用 Layout-list 制作背景 1.  制作替代白屏的背景:bg_splash.xml 2. 将 bg_spl ...

  9. android Activity全屏显示

    设置Activity全屏显示的两种方式: 1.在Activity中动态的设置 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().se ...

最新文章

  1. ubuntu16.04上安装valgrind
  2. 洛谷 P1111 修复公路(最小生成树)
  3. python环境设置_MacOS中的Python(和NumPy)开发环境设置
  4. 40岁的程序员还能找到工作吗_如果程序员已经到三十岁了,那他还能找到满意的工作吗?...
  5. Qt Quick测试
  6. LeetCode 多线程 1115. 交替打印FooBar
  7. java流行的测试框架调研+市面上书籍调研
  8. python模型的属性是什么_Python的自定义属性访问跟描述器以及ORM模型的简单介绍...
  9. 怎么在activity里面操作listView的item里的组件的点击事件
  10. linux nightshift调整,iOS9.3夜间模式怎么设置?iOS9.3 Night Shift设置教程
  11. 程门立雪的故事,成语程门立雪的主人公是谁?
  12. 训练集与测试集分布差距
  13. 在Git项目中使用pre-commit统一管理hooks
  14. liunx版pgadmin3 source code安装
  15. 软件测试用例篇总结概述
  16. 使用win7 快捷键
  17. zigbee网关 CC2530 zstack用手机显示终端传来的lm75a温度传感器的值
  18. html二级菜单:DIV+CSS制作二级菜单(横排二级下拉菜单)以及二级菜单出现错位怎么解决
  19. (转)逃脱者可获生机(上)
  20. kotlin用it还是this?

热门文章

  1. [20170420]关于延迟块清除3.txt
  2. [Android]Android端ORM框架——RapidORM(v1.0)
  3. dmz“非军事化区”
  4. 很实用但经常忘的小常识
  5. 2019BATJ面试题汇总详解:MyBatis+MySQL+Spring+Redis+多线程
  6. vue eventBus 跳坑的办法
  7. Zabbix 3.2.6通过ODBC监控MySQLOracle
  8. 深入理解 Laravel Eloquent(三)——模型间关系(关联)
  9. 分布式缓存系统Memcached简介与实践(.NET memcached client library)
  10. Android - Manifest 文件 详解