ViewPager詳解(二)廣告輪播圖

效果圖

效果圖

一侨嘀、ViewPager填充圖片

1.1 布局中申明

  • 由于是顯示廣告條强衡,所以高度要固定住

      <android.support.v4.view.ViewPager
          android:id="@+id/viewpager"
          android:layout_width="match_parent"
          android:layout_height="120dp"/>
    

1.2 代碼中設(shè)置頁(yè)面數(shù)據(jù)

  • 準(zhǔn)備顯示圖片控件的集合

      // 準(zhǔn)備顯示的圖片集合
      mList = new ArrayList<>();
      for (int i = 0; i < mImages.length; i++) {
          ImageView imageView = new ImageView(this);
          // 將圖片設(shè)置到ImageView控件上
          imageView.setImageResource(mImages[i]);
    
          // 將ImageView控件添加到集合
          mList.add(imageView);
      }
    
  • 自定義類書寫適配器

      @Override
      public Object instantiateItem(ViewGroup container, int position) {
          // return super.instantiateItem(container, position);
          // 將圖片控件添加到容器
          container.addView(mList.get(position));
    
          // 返回
          return mList.get(position);
      }
    

二嫉拐、底部小圓點(diǎn)顯示邏輯

原理分析:底部的小圓點(diǎn)時(shí)浮動(dòng)在ViewPager上面的的迅耘,所以應(yīng)該是一個(gè)RelativeLayout布局绽诚。
ViewPager頁(yè)面切換時(shí)小圓點(diǎn)的顏色不一樣,所以需要對(duì)小圓點(diǎn)做選擇器内列,并且對(duì)ViewPager進(jìn)行監(jiān)聽撵术。

2.1 布局申明

  • 需要用一個(gè)RelativeLayout將ViewPager和包裹圓點(diǎn)的LinearLayout包裹起來(lái)
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="120dp">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="120dp"/>

        <LinearLayout
            android:id="@+id/pointgroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
          android:layout_centerHorizontal="true"
            android:layout_marginBottom="3dp"
            android:orientation="horizontal">
        </LinearLayout>


    </RelativeLayout>

2.2 制作小圓點(diǎn)顏色選擇器

  • 選擇器的選中狀態(tài)應(yīng)該設(shè)置為selected,因?yàn)閷?duì)ViewPager監(jiān)聽時(shí)可以設(shè)置selected的屬性

      <selector xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:drawable="@drawable/shape_point_normal" android:state_selected="false"/>
          <item android:drawable="@drawable/shape_point_selected" android:state_selected="true"/>
      </selector>
      
      <shape xmlns:android="http://schemas.android.com/apk/res/android"
             android:shape="oval">
          <solid android:color="#66000000"/>
      </shape
      
      <shape xmlns:android="http://schemas.android.com/apk/res/android"
          android:shape="oval">
          <solid android:color="#FFFFFF"/>
      </shape>
    

2.3 將小圓點(diǎn)添加到LinearLayout容器

  • 小圓點(diǎn)其實(shí)就是一個(gè)ImageView话瞧,所以在做出ViewPager的頁(yè)面圖片時(shí)嫩与,一起把小圓點(diǎn)也做了

  • 初始化ImageView添加到LinearLayout之前,需要設(shè)置小圓點(diǎn)的布局參數(shù)交排,包括位置和大小

      LinearLayout pointGroup = (LinearLayout) findViewById(R.id.pointgroup);
    
      for (int i = 0; i < mImages.length; i++) {
          // 制作底部小圓點(diǎn)
          ImageView pointImage = new ImageView(this);
          pointImage.setImageResource(R.drawable.shape_point_selector);
    
          // 設(shè)置小圓點(diǎn)的布局參數(shù)
          int PointSize = getResources().getDimensionPixelSize(R.dimen.point_size);
          LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(PointSize, PointSize);
    
          if (i > 0) {
              params.leftMargin = getResources().getDimensionPixelSize(R.dimen.point_margin);
              pointImage.setSelected(false);
          } else {
              pointImage.setSelected(true);
          }
          pointImage.setLayoutParams(params);
          // 添加到容器里
          pointGroup.addView(pointImage);
      }
    

三划滋、小圓點(diǎn)隨著ViewPager切換移動(dòng)

  • 其實(shí)就是對(duì)ViewPager設(shè)置滑動(dòng)監(jiān)聽,當(dāng)滑動(dòng)到每一頁(yè)時(shí)就設(shè)置小圓點(diǎn)為選中狀態(tài)埃篓,這樣小圓點(diǎn)就顯示白色处坪,其他頁(yè)面就設(shè)置為未選中狀態(tài)顯示灰色。

      // 對(duì)ViewPager設(shè)置滑動(dòng)監(jiān)聽
      viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
          @Override
          public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
          }
    
          int lastPosition;
          @Override
          public void onPageSelected(int position) {
              // 頁(yè)面被選中
              // 設(shè)置當(dāng)前頁(yè)面選中
              pointGroup.getChildAt(position).setSelected(true);
              // 設(shè)置前一頁(yè)不選中
              pointGroup.getChildAt(lastPosition).setSelected(false);
    
              // 替換位置
              lastPosition = position;
    
          }
    
          @Override
          public void onPageScrollStateChanged(int state) {
    
          }
      });
    
  • 這里設(shè)置選中和未選中除了可以用替換position的方法之外架专,還可以再定義一個(gè)ImageView來(lái)記錄選中的ImageView同窘,然后在監(jiān)聽里替換,思想都是一樣的胶征。


經(jīng)過(guò)前面的三步設(shè)置后就能顯示一個(gè)簡(jiǎn)單的廣告條了塞椎,這里再對(duì)其添加一個(gè)滑動(dòng)到最后一頁(yè)后再滑還能滑動(dòng)到首頁(yè)的功能。

四睛低、無(wú)限滑動(dòng)的ViewPager

實(shí)現(xiàn)原理: ViewPager之所以滑動(dòng)到左右能顯示頁(yè)面案狠,其實(shí)是因?yàn)樽笥叶即嬖诩磳⒁@示的頁(yè)面服傍。當(dāng)左右有很多頁(yè)面時(shí)我們就能一直滑動(dòng),沒(méi)有時(shí)就不能滑動(dòng)骂铁。所以原理就是讓ViewPager的左右都有很多的頁(yè)面吹零。

4.1 修改getCount方法

  • ViewPager能顯示多少個(gè)頁(yè)面全由getCount方法說(shuō)了算,所以我們首先要改造它拉庵。

      @Override
      public int getCount() {
          // 返回整數(shù)的最大值
          return Integer.MAX_VALUE;
      }
    

4.2 修改instantiateItem方法

  • 因?yàn)閜osition變了灿椅,所以顯示的位置也變了,這里需要進(jìn)行取%運(yùn)算钞支,來(lái)還原position茫蛹。

      // 修改position
      position = position % mList.size();
    

4.3 修改ViewPager監(jiān)聽器里的onPageSelected

  • 用到了position就要修改。

      position = position % mList.size();
    

修改之后烁挟,ViewPager當(dāng)前頁(yè)的右邊就有了無(wú)數(shù)的頁(yè)面婴洼,但是因?yàn)?了mList.size(),就只會(huì)顯示mList.size()的大小撼嗓,這樣就實(shí)現(xiàn)了無(wú)限滑動(dòng)輪播

五柬采、無(wú)限自動(dòng)輪播的廣告圖

實(shí)現(xiàn)原理:在前面四步的基礎(chǔ)上,在代碼里添加一個(gè)Handler且警,不斷的給自己發(fā)消息就好了粉捻。

mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int currentPosition = viewPager.getCurrentItem();

            if(currentPosition == viewPager.getAdapter().getCount() - 1){
                // 最后一頁(yè)
                viewPager.setCurrentItem(0);
            }else{
                viewPager.setCurrentItem(currentPosition + 1);
            }

            // 一直給自己發(fā)消息
            mHandler.postDelayed(this,5000);
        }
    },5000);    

自定義帶動(dòng)畫無(wú)限自動(dòng)輪播的Banner控件


個(gè)人主頁(yè)
Demo下載地址

Banner相關(guān)請(qǐng)查看最新開源項(xiàng)目BannerView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斑芜,隨后出現(xiàn)的幾起案子肩刃,更是在濱河造成了極大的恐慌,老刑警劉巖杏头,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件树酪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡大州,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門垂谢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厦画,“玉大人,你說(shuō)我怎么就攤上這事滥朱「睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵徙邻,是天一觀的道長(zhǎng)排嫌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缰犁,這世上最難降的妖魔是什么淳地? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任怖糊,我火速辦了婚禮,結(jié)果婚禮上颇象,老公的妹妹穿的比我還像新娘伍伤。我一直安慰自己,他們只是感情好遣钳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布扰魂。 她就那樣靜靜地躺著,像睡著了一般蕴茴。 火紅的嫁衣襯著肌膚如雪劝评。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天倦淀,我揣著相機(jī)與錄音蒋畜,去河邊找鬼。 笑死晃听,一個(gè)胖子當(dāng)著我的面吹牛百侧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播能扒,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼佣渴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了初斑?” 一聲冷哼從身側(cè)響起辛润,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎见秤,沒(méi)想到半個(gè)月后砂竖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹃答,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年乎澄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测摔。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡置济,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锋八,到底是詐尸還是另有隱情浙于,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布挟纱,位于F島的核電站羞酗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏紊服。R本人自食惡果不足惜檀轨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一胸竞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裤园,春花似錦撤师、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至淤袜,卻和暖如春痒谴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铡羡。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工积蔚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烦周。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓尽爆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親读慎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漱贱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 目前市場(chǎng)上的APP中,輪播圖可以說(shuō)是很常見(jiàn)的夭委。一個(gè)好的輪播圖幅狮,基本上適用于所有的APP。是時(shí)候打造一個(gè)自己的...
    帶心情去旅行閱讀 17,313評(píng)論 15 93
  • 這是谷歌官方給我們提供的一個(gè)兼容低版本安卓設(shè)備的軟件包株灸,里面包囊了只有在安卓3.0以上可以使用的api崇摄。而view...
    Ten_Minutes閱讀 5,738評(píng)論 1 19
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,164評(píng)論 25 707
  • final 關(guān)鍵字使用說(shuō)明 final可以用來(lái)修飾成員變量, 局部變量慌烧,類和方法逐抑。 final修飾的變量只能賦值一...
    wyyjava閱讀 505評(píng)論 0 1
  • 【知乎LIVE聽后感系列-02】 閱讀的思想與方法—從元知識(shí)角度教你正確高效閱讀 1 LIVE概覽 《閱讀的思想...
    馳騁于天下閱讀 1,460評(píng)論 6 12