1. 程式人生 > >viewpager一屏展示多個檢視

viewpager一屏展示多個檢視

   最近看到一個應用的banner寫的很有意思,在一個viewpager中可以看見左右兩個item的部分檢視,研究了下,發現實現其實很簡單,記述如下。

   先看下效果圖:

  


  下面來說下實現過程:

    1.viewpager及其父控制元件的佈局加上該屬性clipChildren=“false”,clipChildren屬性表示子view在繪製時不去裁切他們的檢視範圍。這樣childView就不會被父view的寬高所限制。

    2.viewpager左右設定一個margin,以便讓兩邊的item出現在可見區域。

   3.設定一下viewpager的介面卡就完成了。如果想要設定下viewpager的滑動動畫,可以用setpageTransform()方法來定製。

  貼一下xml程式碼:

 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:clipChildren="false">


        <android.support.v4.view.ViewPager
            android:id="@+id/vp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="40dp"
            android:layout_marginRight="40dp"
            android:clipChildren="false" />

    </FrameLayout>


二、若是想要在viewpager的可見區域中,顯示兩個item如何實現呢?

     一頁顯示兩個item,那麼viewpager的margin就只能設定一個,並且需要程式碼中動態設定了。每個item的寬度為螢幕的寬度減去相鄰item的邊距,再除以2即可。

 

   private void setViewpagerMargin() {

        WindowManager wm = this.getWindowManager();
        int width = wm.getDefaultDisplay().getWidth();
        marginLeft = (width - 20) / 2;

        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) vp.getLayoutParams();
        layoutParams.leftMargin = marginLeft;
        vp.setLayoutParams(layoutParams);
    }
 

  但是這種情況注意,viewpager的滑動事件只在currentItem上,另一個可見的item不能滑動,如果想要整體滑動還得自定義一個view,重寫觸控事件。



三、說說viewpager的無限迴圈

   輪播圖開發中也用了很多了,對viewpager的迴圈機制順便做下總結。

  1.設定viewpager的介面卡時,getCount設定int型別的最大值,再將當前的item設定為中間值,基本上也算實現了輪播。但是這裡有個大問題,getCount的值是childView的個數,過多的話會導致佔用太多資源,效能低。

 2.在viewpager邊界處設定一箇中間的view,滑到邊界時,呼叫setCurrent(int,false)方法,無感切換到中間位置,這樣雖然不停的滑動實際仍然在當前的幾個item上。

 /**
     * 由於一屏顯示多個頁面,viewpager設定兩遍childView,再包裝邊界頁面
     * 圖片顯示順序:a5,a1,a2...,a5,a1,a2...,a5,a1
     */
    private void initViewPagerChildView() {
        viewList.clear();
        for (int i = 0; i < (imgResources.length * 2) + 2; i++) {
            ImageView view = new ImageView(MainActivity.this);
            view.setScaleType(ImageView.ScaleType.CENTER_CROP);
            if (i == 0) {
                //第一個位置顯示最後一張圖片
                view.setImageResource(imgResources[imgResources.length - 1]);
            } else if (i == (imgResources.length * 2) + 1) {
                //最後一個位置顯示第一張圖片
                view.setImageResource(imgResources[0]);
            } else {
                //儲存兩遍資源檢視
                if (i <= imgResources.length) {
                    view.setImageResource(imgResources[i - 1]);
                } else {
                    view.setImageResource(imgResources[i - imgResources.length - 1]);
                }
            }
            viewList.add(view);
        }
    }

  程式碼地址
  That is all。