溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在Android中利用 ViewPager實(shí)現(xiàn)一個(gè)循環(huán)播放功能

發(fā)布時(shí)間:2020-11-26 16:24:28 來源:億速云 閱讀:125 作者:Leah 欄目:移動開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)如何在Android中利用 ViewPager實(shí)現(xiàn)一個(gè)循環(huán)播放功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

1.初始化布局

我們先來寫一個(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"/>
    <!-- 動態(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)模樣:

如何在Android中利用 ViewPager實(shí)現(xiàn)一個(gè)循環(huán)播放功能

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

接下來進(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)目開發(fā)數(shù)據(jù)大都來自網(wǎng)絡(luò)。

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {

  private List<ImageView> vpLists;
  private LinearLayout ll_dot_group; //用來添加小圓點(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滑動的監(jiān)聽事件
    vp.addOnPageChangeListener(this);

    //實(shí)現(xiàn)自動切換的功能
    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對象
    @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)新的頁面被選中的時(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)頁面開始滑動
  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  }

}

如上我們就解決了平滑過渡的問題,關(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è)廣告可以平滑過渡了,但是還有一個(gè)問題就是,那從第一張開始,我們往左滑呢?其實(shí)也很容易解決,就是設(shè)置第一個(gè)條目為Integer.MAX_VALUE的中間位置就可以了,我們來到initView方法中,設(shè)置當(dāng)前viewpager要顯示第幾個(gè)條目:

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

問題完美解決。

用到的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>

關(guān)于如何在Android中利用 ViewPager實(shí)現(xiàn)一個(gè)循環(huán)播放功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI