Android ViewPager實現圖片輪播效果_Android

來源:互聯網
上載者:User

在app中圖片的輪播顯示可以說是非常常見的實現效果了,其實現原理不過是利用ViewPager,然後利用handler每隔一定的時間將ViewPager的currentItem設定為當前item的position+1即可。先來看看效果圖吧:

 

就是實現這樣的一個輪播廣告的效果。

因為這個是自己為了練習仿照某旅遊類App做的,所以這裡的資料是使用抓包工具抓取的,準備資料等工作就不在這裡贅述了,反正資料的添加大體都是相同的。我的思路是這樣的,從網路上即時的擷取資料(當然你也可以將資料寫死),然後通過網路工具類和json解析類完成對資料的解析與封裝從List集合。根據集合的長度來決定ViewPager有多少page頁面,下面的小圓點有多少。在函數中首先要設定一個boolean類型的標誌位,用來判斷是否停止輪播的(我們要在此頁面不可見(onStop()方法內)的時候結束輪播),定義一個全域變數來記錄當前的小圓點的位置。
private boolean isStop = false;  //標誌位,判斷是否停止輪播
private int previousPointEnale = 0;  //標記上一個小圓點的位置

然後我們就要為ViewPager的輪播做準備了,比如說動態根據資料條目來產生小圓點,定義適配器等,代碼如下:

/**   * banner的圖片輪播事件初始化   */  private void initCycleEvent() {    //根據解析到的圖片的個數,初始化小圓點    LinearLayout.LayoutParams params;    for (int i = 0; i < imageViewList.size(); i++) {      View dot = new View(getActivity());      dot.setBackgroundResource(R.drawable.point_background);       params = new LinearLayout.LayoutParams(15, 15);      params.leftMargin = 10;      dot.setLayoutParams(params);      dot.setEnabled(false);      ll_dot_group.addView(dot);    }    //定義匿名適配器    adapter = new PagerAdapter() {      @Override      public int getCount() {        //因為要實現輪播,所以將數值設定的大一些        return Integer.MAX_VALUE;      }      @Override      public boolean isViewFromObject(View view, Object object) {        return view == object;      }      @Override      public Object instantiateItem(ViewGroup container, final int position) {        imageViewList.get(position % imageViewList.size()).setOnClickListener(new View.OnClickListener() {          @Override          public void onClick(View v) {            Intent intent = new Intent(getActivity(), WebViewActivity.class);            intent.putExtra("url", bannerList.get(position % imageViewList.size()).getUrl());            startActivity(intent);          }        });        container.addView(imageViewList.get(position % imageViewList.size()));        return imageViewList.get(position % imageViewList.size());      }      @Override      public void destroyItem(ViewGroup container, int position, Object object) {        container.removeView(imageViewList.get(position % imageViewList.size()));      }    };    vp_banner.setAdapter(adapter);    //初始化第一個page頁和第一個小圓點    vp_banner.setCurrentItem(0);    ll_dot_group.getChildAt(0).setEnabled(true);    //為viewPager設定監聽    vp_banner.addOnPageChangeListener(new MyPageChangeListener());  }

這裡小圓點我們沒有用圖片,而是用自訂的<selector>和<shape>結合來展示出來的。

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">  <item android:drawable="@drawable/point_bg_enable" android:state_enabled="true"/>   <item android:drawable="@drawable/point_bg_normal" android:state_enabled="false"/></selector>

小圓點擷取焦點的時候顯示的是這個<shape>資源檔: 

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="oval" >  <corners android:radius="3dp" />  <solid android:color="#AAFFFFFF" /></shape>

失去焦點的時候: 

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="oval" >  <corners android:radius="3dp" />  <solid android:color="#55000000" /></shape>

適配器PagerAdapter中的getCount()方法,這個方法是返回要展示產生的ViewPager的page頁的個數的,instantiateItem()方法(載入page頁)的執行次數是根據getCount()的傳回值來決定的,所以我們這裡因為要"無限"迴圈,所以將其設定的大一些,使用INTEGER.MAX整數的最大值來表示。imageViewList是儲存我們要展示的imageView的集合,正常情況下不需要輪播的時候,我們直接根據position來addView()即可,但是因為要實現輪播,所以我們利用position和imageViewList集合的長度使用求餘的方法來確定圖片的下標

position % imageViewList.size()

下面是定義適配器和動態產生標識圖片位置的小圓點的代碼: 

/**   * banner的圖片輪播事件初始化   */  private void initCycleEvent() {    //根據解析到的圖片的個數,初始化小圓點    LinearLayout.LayoutParams params;    for (int i = 0; i < imageViewList.size(); i++) {      View dot = new View(getActivity());      dot.setBackgroundResource(R.drawable.point_background);      params = new LinearLayout.LayoutParams(15, 15);      params.leftMargin = 10;      dot.setLayoutParams(params);      dot.setEnabled(false);      ll_dot_group.addView(dot);    }    //定義匿名適配器    adapter = new PagerAdapter() {      @Override      public int getCount() {        //因為要實現輪播,所以將數值設定的大一些        return Integer.MAX_VALUE;      }      @Override      public boolean isViewFromObject(View view, Object object) {        return view == object;      }      @Override      public Object instantiateItem(ViewGroup container, final int position) {        imageViewList.get(position % imageViewList.size()).setOnClickListener(new View.OnClickListener() {          @Override          public void onClick(View v) {            Intent intent = new Intent(getActivity(), WebViewActivity.class);            intent.putExtra("url", bannerList.get(position % imageViewList.size()).getUrl());            startActivity(intent);          }        });        container.addView(imageViewList.get(position % imageViewList.size()));        return imageViewList.get(position % imageViewList.size());      }      @Override      public void destroyItem(ViewGroup container, int position, Object object) {        container.removeView(imageViewList.get(position % imageViewList.size()));      }    };    vp_banner.setAdapter(adapter);    //初始化第一個page頁和第一個小圓點    vp_banner.setCurrentItem(0);    ll_dot_group.getChildAt(0).setEnabled(true);    //為viewPager設定監聽    vp_banner.addOnPageChangeListener(new MyPageChangeListener());  }

記住在addView()和removeView()的時候都是要根據求餘的值來找到對應位置的應該展示的imageView。初始化工作完成,下面應該是完成對輪播的操作了,這裡我們開啟一個線程來每相隔一定的時間,擷取當前ViewPager的page頁的position,然後+1,再設定當前page頁下標為這個新的值即可: 

/**   * 開啟輪播線程的方法   */  private void startBannerScrollThread() {    new Thread(new Runnable() {      @Override      public void run() {        //先判斷是否停止輪播        while (!isStop) {          SystemClock.sleep(2000);          handler.post(new Runnable() {            @Override            public void run() {              int newindex = vp_banner.getCurrentItem() + 1;              vp_banner.setCurrentItem(newindex);            }          });        }      }    }).start();  }

當然,因為每個圖片展示給我們的時候,在圖片下方的指示性小圓點要有相應的變化,所以在ViewPager中我們還要處理它的滑動事件,所以我們自訂了一個類,實現了ViewPager.OnPageChangeListener介面,在onPageSelected()方法中處理相應的事件: 

   /*** viewPager滑動監聽事件   */  class MyPageChangeListener implements ViewPager.OnPageChangeListener {    @Override    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {    }    @Override    public void onPageSelected(int position) {      //擷取新的一頁的位置      int newPosition = position % imageViewList.size();      //將上一個小圓點的背景設為預設那個      ll_dot_group.getChildAt(previousPointEnale).setEnabled(false);      //設定當前page頁的小圓點樣式      ll_dot_group.getChildAt(newPosition).setEnabled(true);      //把新的位置賦值給previousPointEnale      previousPointEnale = newPosition;    }    @Override    public void onPageScrollStateChanged(int state) {    }  }

關鍵的代碼和思路就是這樣的,這裡還有一篇我參照的文章,寫的不錯,下面把連結放在這裡:

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.