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

关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值