關於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裏的部分代碼:
其中,默認狀況下,childWidthSize就是頁面item的寬度了,等於ViewPager的寬度減去左右Padding。
咱們給ViewPager設置了左右Padding,頁面item的寬度就變小了,左右的item也就顯示出來了,但要設置ViewPager的clipToPadding=false才行。
另外,設置item的間距,viewPager.setPageMargin(10);
當兩個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
轉自:http://blog.csdn.net/asia_deng/article/details/70176393