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

  • 相关阅读:
    Android游戏开发22:Android动画的实现J2me游戏类库用于Android开发
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第三部分,完整代码)
    使用OGR创建dxf格式矢量数据
    mysql 数据库引擎 MyISAM InnoDB 大比拼 区别
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)
    mysql 更改数据库引擎
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第一部分)
    android 数字键盘使用
    MySQL Innodb数据库性能实践
    eclipse : Error while performing database login with the driver null
  • 原文地址:https://www.cnblogs.com/Sharley/p/8532505.html
Copyright © 2011-2022 走看看