ViewPager一屏顯示多個item,及邊緣滑動事件優化

關於ViewPager顯示兩邊的item方法,網絡上是方法都在ViewPager外包一個Layout,html

而後設置ViewPager和外面的Layout的clipChildren="false"java

ViewPager再設置layout_marginLeft,layout_marginRIght,以留出空間來顯示兩邊的item.android

 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>    

 

這種方法有兩個缺點:網絡

一、手指從兩邊的item滑動時,不能切換page,由於兩邊的item並不在ViewPager的範圍內。spa

二、在4.2和如下的系統滑動會出現兩邊的item沒有一塊兒滑動(父Layout沒有刷新),聽說要關閉硬件加速,筆者沒試過。.net

下面介紹另外一種方法。

筆者使用的v4包版本是23.3,不保證23.3如下的版本有效code

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。xml

就是這麼簡單,就解決了第一個方法的兩個缺點。htm

至於爲何,看ViewPager的源碼就知道了。blog

下面是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

相關文章
相關標籤/搜索