zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    用JAVA发送一个XML格式的HTTP请求
    LR 测试http协议xml格式数据接口
    软件测试术语
    linux学习笔记
    接口测试文章整理
    InputStream只能读取一次的解决办法 C# byte[] 和Stream转换
    zTree更新自定义标签>>>
    C# 各类常见Exception 异常信息
    C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try
    SQL Server 2014 清除用户名和密码
  • 原文地址:https://www.cnblogs.com/Sharley/p/8532505.html
Copyright © 2011-2022 走看看