欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android ViewPager循環(huán)播放廣告實(shí)例詳解

 更新時(shí)間:2017年03月07日 09:02:25   投稿:lqh  
這篇文章主要介紹了Android ViewPager循環(huán)播放廣告條實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

Android  實(shí)現(xiàn)ViewPager循環(huán)播放廣告條實(shí)例詳解

我們經(jīng)常會(huì)看到有一些app的banner界面可以實(shí)現(xiàn)循環(huán)播放多個(gè)廣告圖片和手動(dòng)滑動(dòng)循環(huán)的效果??吹侥菢拥男Ч?,相信大家都會(huì)想到ViewPager,但是ViewPager并不支持循環(huán)翻頁(yè),所以要實(shí)現(xiàn)循環(huán)還得需要自己去動(dòng)手。最后還有一個(gè)問(wèn)題就是翻頁(yè)到最后一頁(yè)如何平滑過(guò)渡到首頁(yè)的問(wèn)題。這些都源于有人私信問(wèn)我ViewPager廣告條如何平滑過(guò)渡的問(wèn)題,出于這個(gè)問(wèn)題,我想著親自實(shí)現(xiàn)并分享下吧,本篇就是為了解決這些問(wèn)題而寫(xiě)的。

1.初始化布局

我們先來(lái)寫(xiě)一個(gè)ViewPager廣告條的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <android.support.v4.view.ViewPager
    android:id="@+id/vp"
    android:layout_width="match_parent"
    android:layout_height="210dp"/>
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/vp"
    android:background="#55000000"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="5dp">
    <TextView
      android:id="@+id/tv_img_desc"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="這里是廣告標(biāo)題"
      android:textColor="#ffffff"
      android:textSize="16sp"/>
    <!-- 動(dòng)態(tài)添加小圓點(diǎn),用一個(gè)水平的線性布局 -->
    <LinearLayout
      android:id="@+id/ll_dot_group"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:orientation="horizontal"/>
  </LinearLayout>
</RelativeLayout>

此時(shí)的效果如下,是不是已經(jīng)有了點(diǎn)模樣:

xml

2.Activity實(shí)現(xiàn)

接下來(lái)進(jìn)入到關(guān)鍵的實(shí)現(xiàn)代碼,當(dāng)然,Activity實(shí)現(xiàn)也難不倒我們,其中ViewPager數(shù)據(jù),為了方便,本篇就直接用本地?cái)?shù)據(jù)進(jìn)行模擬了。而在實(shí)際項(xiàng)目開(kāi)發(fā)數(shù)據(jù)大都來(lái)自網(wǎng)絡(luò)。

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {

  private List<ImageView> vpLists;
  private LinearLayout ll_dot_group; //用來(lái)添加小圓點(diǎn)
  private String[] imageDescArrs;
  private TextView tv_img_desc;
  private ViewPager vp;

  private boolean isSwitchPager = false; //默認(rèn)不切換
  private int previousPosition = 0; //默認(rèn)為0

  private Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
      //更新當(dāng)前viewpager的 要顯示的當(dāng)前條目
      vp.setCurrentItem(vp.getCurrentItem() + 1);
    }
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
  }

  /**
   * 初始化view
   */
  private void initView() {
    vp = (ViewPager) findViewById(R.id.vp);
    ll_dot_group = (LinearLayout) findViewById(R.id.ll_dot_group);
    tv_img_desc = (TextView) findViewById(R.id.tv_img_desc);

    initViewPagerData();
    vp.setAdapter(new ViewpagerAdapter());

    //設(shè)置當(dāng)前viewpager要顯示第幾個(gè)條目
    int item = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2 % vpLists.size());
    vp.setCurrentItem(item);

    //把第一個(gè)小圓點(diǎn)設(shè)置為白色,顯示第一個(gè)textview內(nèi)容
    ll_dot_group.getChildAt(previousPosition).setEnabled(true);
    tv_img_desc.setText(imageDescArrs[previousPosition]);
    //設(shè)置viewpager滑動(dòng)的監(jiān)聽(tīng)事件
    vp.addOnPageChangeListener(this);

    //實(shí)現(xiàn)自動(dòng)切換的功能
    new Thread() {
      public void run() {
        while (!isSwitchPager) {
          SystemClock.sleep(3000);
          //拿著我們創(chuàng)建的handler 發(fā)消息
          handler.sendEmptyMessage(0);
        }
      }
    }.start();
  }

  /**
   * 初始化ViewPager的數(shù)據(jù)
   */
  private void initViewPagerData() {
    imageDescArrs = new String[]{"標(biāo)題1", "標(biāo)題2", "標(biāo)題3", "標(biāo)題4", "標(biāo)題5"};
    vpLists = new ArrayList<ImageView>();
    int imgIds[] = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e};
    ImageView iv;
    View dotView;

    for (int i = 0; i < imgIds.length; i++) {
      iv = new ImageView(this);
      iv.setBackgroundResource(imgIds[i]);
      vpLists.add(iv);
      //準(zhǔn)備小圓點(diǎn)的數(shù)據(jù)
      dotView = new View(getApplicationContext());
      dotView.setBackgroundResource(R.drawable.selector_dot);
      //設(shè)置小圓點(diǎn)的寬和高
      LayoutParams params = new LayoutParams(15, 15);
      //設(shè)置每個(gè)小圓點(diǎn)之間距離
      if (i != 0) {
        params.leftMargin = 15;
      }
      dotView.setLayoutParams(params);
      //設(shè)置小圓點(diǎn)默認(rèn)狀態(tài)
      dotView.setEnabled(false);
      //把dotview加入到線性布局中
      ll_dot_group.addView(dotView);
    }
  }

  /**
   * 定義數(shù)據(jù)適配器
   */
  private class ViewpagerAdapter extends PagerAdapter {
    @Override
    public int getCount() {
      return Integer.MAX_VALUE;
    }

    //是否復(fù)用當(dāng)前view對(duì)象
    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
      return arg0 == arg1;
    }

    //初始化每個(gè)條目要顯示的內(nèi)容
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      //拿著position位置 % 集合.size
      int newposition = position % vpLists.size();
      //獲取到條目要顯示的內(nèi)容imageview
      ImageView iv = vpLists.get(newposition);
      //要把 iv加入到 container 中
      container.addView(iv);
      return iv;
    }

    //銷毀條目
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
      //移除條目
      container.removeView((View) object);
    }
  }

  //當(dāng)新的頁(yè)面被選中的時(shí)候調(diào)用
  @Override
  public void onPageSelected(int position) {
    //拿著position位置 % 集合.size
    int newposition = position % vpLists.size();
    //取出postion位置的小圓點(diǎn) 設(shè)置為true
    ll_dot_group.getChildAt(newposition).setEnabled(true);
    //把一個(gè)小圓點(diǎn)設(shè)置為false
    ll_dot_group.getChildAt(previousPosition).setEnabled(false);
    tv_img_desc.setText(imageDescArrs[newposition]);
    previousPosition = newposition;
  }

  @Override
  protected void onDestroy() {
    //當(dāng)Activity銷毀的時(shí)候 把是否切換的標(biāo)記置為true
    isSwitchPager = true;
    super.onDestroy();
  }

  @Override
  public void onPageScrollStateChanged(int state) {
  }

  //當(dāng)頁(yè)面開(kāi)始滑動(dòng)
  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  }

}

如上我們就解決了平滑過(guò)渡的問(wèn)題,關(guān)鍵的地方就是ViewpagerAdapter:

getCount方法我們返回Integer.MAX_VALUE

public int getCount() {
  return Integer.MAX_VALUE;
}

初始化每個(gè)條目要顯示的內(nèi)容,我們拿著position位置 % 集合.size

@Override
public Object instantiateItem(ViewGroup container, int position) {
  //拿著position位置 % 集合.size
  int newposition = position % vpLists.size();
  //獲取到條目要顯示的內(nèi)容imageview
  ImageView iv = vpLists.get(newposition);
  //要把 iv加入到 container 中
  container.addView(iv);
  return iv;
}

此時(shí)我們發(fā)現(xiàn)已經(jīng)最后一個(gè)廣告可以平滑過(guò)渡了,但是還有一個(gè)問(wèn)題就是,那從第一張開(kāi)始,我們往左滑呢?其實(shí)也很容易解決,就是設(shè)置第一個(gè)條目為Integer.MAX_VALUE的中間位置就可以了,我們來(lái)到initView方法中,設(shè)置當(dāng)前viewpager要顯示第幾個(gè)條目:

int item = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2 % vpLists.size());
vp.setCurrentItem(item);

問(wèn)題完美解決。

用到的Shape相關(guān)資源如下:

selector_dot.xml

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

dot_enable.xml

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

dot_normal.xml

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

來(lái)看看效果圖:

效果圖

到此,一個(gè)平滑過(guò)渡的ViewPager廣告條已經(jīng)完美實(shí)現(xiàn)了。

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論