關於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里的部分代碼:
其中,默認情況下,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
轉自:http://blog.csdn.net/asia_deng/article/details/70176393
