ViewPager一屏显示多个item,及边缘滑动事件优化
关于ViewPager显示两边的item方法,网络上是方法都在ViewPager外包一个Layout,
然后设置ViewPager和外面的Layout的clipChildren="false"。
ViewPager再设置layout_marginLeft,layout_marginRIght,以留出空间来显示两边的item.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/viewPagerContainer"
android:layout_height="match_parent"
android:background="#EEEEEE"
android:clipChildren="false"
android:orientation="vertical" > <android.support.v4.view.ViewPager
android:id="@+id/viewpage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="80dp"
android:layout_marginRight="80dp"
android:clipChildren="false" /> </LinearLayout>
这种方法有两个缺点:
1、手指从两边的item滑动时,不能切换page,因为两边的item并不在ViewPager的范围内。
2、在4.2和以下的系统滑动会出现两边的item没有一起滑动(父Layout没有刷新),据说要关闭硬件加速,笔者没试过。
下面介绍另一种方法。
笔者使用的v4包版本是23.3,不保证23.3以下的版本有效
<android.support.v4.view.ViewPager
android:id="@+id/viewpage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="80dp"
android:paddingRight="80dp"
android:clipToPadding="false"
这里只是把marginLeft和marginRight换成了paddingLeft和paddingRight,clipChildren换成了clipToPadding。
就是这么简单,就解决了第一个方法的两个缺点。
至于为什么,看ViewPager的源码就知道了。
下面是ViewPager的onMeasure里的部分代码:
其中,默认情况下,childWidthSize就是页面item的宽度了,等于ViewPager的宽度减去左右Padding。
我们给ViewPager设置了左右Padding,页面item的宽度就变小了,左右的item也就显示出来了,但要设置ViewPager的clipToPadding=false才行。
另外,设置item的间距,viewPager.setPageMargin(10);
两个ViewPager嵌套时
当两个viewPager嵌套时,正好要显示两边item的viewPager是内层View时,当手指在接近屏幕边缘滑动时,比如,在右边缘左滑来显示内层ViewPager右边的内容时,会发现内层的ViewPager没有切换,而是切换了父ViewPager的页面。
解决方法是:
public static void clearGutterSize(ViewPager viewPager) {
try {
Field field = ViewPager.class.getDeclaredField("mDefaultGutterSize");
field.setAccessible(true);
field.set(viewPager, );
viewPager.requestLayout();
} catch (Exception e) {
Log.d("MyViewPager", "#clearGutterSize:", e);
}
}
内层和外层两个viewPager都要clearGutterSize
转自:http://blog.csdn.net/asia_deng/article/details/70176393
ViewPager一屏显示多个item,及边缘滑动事件优化的更多相关文章
- 【转】ViewPager 一屏显示多个子页面
一.概述 项目中遇到一个需求:ViewPager 一屏显示多个子页面.因为之前没有做过这样的界面,所以经历了些许小插曲,特以记之! 主要内容来自: http://blog.csdn.net/JM_be ...
- Android ViewPager系列之ViewPager一屏显示多个子页面
ViewPager一屏显示多个子页面,常见的有两种形式: 1.当前展示的页面右侧显示一部分下个页面的内容 2.当前页面居中,左右两边分别显示上一个页面.下一个页面 第 1 种表现形式的实现代码 其实这 ...
- ViewPager单页显示3个item
原文地址:https://github.com/hongyangAndroid/MagicViewPager/wiki MagicViewPager 单页显示3个Item的ViewPager炫酷切换效 ...
- 【转】ViewPager实现一个页面多个Item的显示
转自:http://billyyuan.iteye.com/blog/1941538 ViewPager实现一个页面多个Item的显示 博客分类: android 代码在: https://cod ...
- Android开发之全屏显示的两种方法
1.通过修改清单文件中Theme,实现全屏 <application android:name=".MyApplication" android:allowBackup=&q ...
- android启动画面隐藏状态栏全屏显示
1.在根部局给一个id,然后直接设置就行了layout.setSystemUiVisibility(View.INVISIBLE); 状态栏就没有了. 2.如果你只是想改变状态栏颜色的也可以 //5. ...
- 解决Viewpager满屏不能自适应填充内容的三种办法
由于排版问题,本人博客园同名博文地址为:http://www.cnblogs.com/bill-technology/articles/3143667.html 很多Android开发者在使用View ...
- Android Activity 去掉标题栏及全屏显示
默认生成的活动(Activity)界面中包含标题栏,并带有状态栏.有时不需要这两个控件. 1.去掉标题栏 (三种方法) a:在setContentView()方法前 添加:requestWindowF ...
- echarts 饼图 + 全屏显示
效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
随机推荐
- iOS 在object-c 中调用c文件 方法
1,新建c 头文件 lib.h 定义 c 函数 2,新建 c 实现文件,新建模板选中 c File lib.c 3,oc 中调用,引用 c 头文件 lib.h ok .搞定
- mac安装GnuGP
1.首先查看gnugp最新的稳定版: localhost:~ jack$ brew search gnupg ==> Formulae gnupg gnupg-pkcs11-scd gnupg@ ...
- [svc]mount命令及解决因/etc/fstab错误导致系统不能启动故障
mount命令-手动挂载设备 格式: mount [options] [-t fstype] [-o option] 设备 挂载点 mount -n -o remount,rw / - Mount t ...
- openssl之EVP系列之13---EVP_Open系列函数介绍
openssl之EVP系列之13---EVP_Open系列函数介绍 ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成 (作者:Dra ...
- HTML5学习笔记(十三):JavaScript函数
函数定义 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述 ...
- C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析
C语言文件打开模式浅析 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式 只可以读 只可以写 读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ...
- TouchEvent: dispatchTouchEvent(), onTouch() , onTouchEvent(), requestDisallowInterceptTouchEvent() 方法中的一些细节
Q: onTouchListener与onClickListener谁先执行?A: onTouchListener中的内容先执行.若其中的onTouch方法返回true,代表该事件已被onTouch消 ...
- lua -- handler
handler 将 Lua 对象及其方法包装为一个匿名函数. 格式: 函数 = handler(对象, 对象.方法) 在 quick-cocos2d-x 中,许多功能需要传入一个 Lua 函数做参数, ...
- Android开发中adb命令的常用方法
Android的SDK中提供了很多有用的工具,在开发过程中如果能熟练使用这些工具,会让我们的开发事半功倍.adb是SDK提供的一个常用的命令行工具,全称为Android Debug Bridge,用于 ...
- C++ STL set和multiset的使用
C++ STL set和multiset的使用 std::set<int> s;那个s这个对象里面存贮的元素是从小到大排序的,(因为用std::less作为比较工具.) 1,set的含义是 ...