国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

android ViewPager實(shí)現(xiàn)自動無限輪播和下方向?qū)A點(diǎn)

2019-10-23 19:45:21
字體:
供稿:網(wǎng)友

一、布局

小圓點(diǎn)形狀的生成shape.xml文件

使用空心還是實(shí)心的把對應(yīng)的注釋去掉就可以了.

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" android:useLevel="false"> <!-- 實(shí)心圓   <solid android:color="#F00"/> --> <!-- 空心圓   <stroke   android:width="1dp"   android:color="@android:color/black"/> --> <size android:width="8dp" android:height="8dp"/></shape>

輪播的ViewPager和向?qū)A點(diǎn)的 布局文件XML

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="200dp"> <android.support.v4.view.ViewPager  xmlns:android="http://schemas.android.com/apk/res/android"  android:id="@+id/hometab_vp"  android:layout_width="match_parent"  android:layout_height="200dp"> </android.support.v4.view.ViewPager> <RelativeLayout  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_alignParentBottom="true"  android:layout_centerHorizontal="true"  android:layout_marginBottom="20dp"  >  <LinearLayout   android:id="@+id/ll_dot"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:orientation="horizontal">   <ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:src="@drawable/shape_guide_dot_default"/>   <ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="5dp"    android:src="@drawable/shape_guide_dot_default"/>   <ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="5dp"    android:src="@drawable/shape_guide_dot_default"/>   <ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="5dp"    android:src="@drawable/shape_guide_dot_default"/>   <ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="5dp"    android:src="@drawable/shape_guide_dot_default"/>  </LinearLayout>  <ImageView   android:id="@+id/dot_red"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:src="@drawable/shape_guide_dot_solid"/> </RelativeLayout></RelativeLayout>

二,代碼

左右輪播的ViewPager的Adapter

/** * 輪播 viewpager的adapter */class MyLoopPagerAdapter extends PagerAdapter { private int[] welcomes; private Context mContext; public MyLoopPagerAdapter(int[] welcomes, Context context) {  this.welcomes = welcomes;  mContext = context; } //  //返回實(shí)際要顯示的圖片數(shù)+2 @Override public int getCount() {  return welcomes.length + 2; } @Override public boolean isViewFromObject(View view, Object object) {  return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) {  ImageView iv = new ImageView(mContext);  int realPosition = (position - 1 + welcomes.length) % welcomes.length;//    設(shè)置背景圖片  iv.setBackgroundResource(welcomes[realPosition]);  container.addView(iv);  return iv; } @Override public void destroyItem(ViewGroup container, int position, Object object) {  //注意不要remove 否則容易閃屏  //     container.removeView((ImageView) object); }}

添加viewpager的addOnPageChangeListener

/**  * 循環(huán)輪播界面change的 監(jiān)聽器  */ class MyLoopPageChangeListener implements ViewPager.OnPageChangeListener {  private ViewPager mViewPager;  private LinearLayout mLlDot;  private ImageView dotRed;  private Handler mHandler;  private Runnable mRunnable;  /**   * 初始化 控件 和 handler   *   * @param viewPager   * @param llDot   * @param dotRed   */  public MyLoopPageChangeListener(ViewPager viewPager, LinearLayout llDot, ImageView dotRed) {   mViewPager = viewPager;   this.mLlDot = llDot;   this.dotRed = dotRed;   initAutoLoop();  }  /**   * 初始化 自動輪播 handler 和 runnable   */  private void initAutoLoop() {   mHandler = new Handler() {    @Override    public void handleMessage(Message msg) {//     LogUtils.e("have received a msg");     int curindex = (mViewPager.getCurrentItem() + 1) % (welcomes.length + 2);     mViewPager.setCurrentItem(curindex, true);    }   };   mRunnable = new Runnable() {    @Override    public void run() {     Message message = new Message();     mHandler.sendMessage(message);    }   };//   開始 輪播   mHandler.postDelayed(mRunnable, 3 * 1000);  }  /**   * 當(dāng)頁面在滑動了調(diào)用   *   * @param position    當(dāng)前頁面,即點(diǎn)擊滑動的頁面   * @param positionOffset  當(dāng)前頁面偏移的百分比   * @param positionOffsetPixels 當(dāng)前頁面偏移的像素位置   */  @Override  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {//   獲取到 真正圖片所在的位置.   int realPosition = (position - 1 + welcomes.length) % welcomes.length;//   獲取到紅點(diǎn) 的 layout 參數(shù)   RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) dotRed.getLayoutParams();//   計算兩個點(diǎn)之間的距離   int dotDis = mLlDot.getChildAt(1).getLeft() - mLlDot.getChildAt(0).getLeft();//   計算總共的左邊距   int totalLeftMargin = (welcomes.length - 1) * dotDis;   // 計算滑動的距離   float dis = realPosition * dotDis + positionOffset * dotDis;//   設(shè)置 margin_left 的值,//   如果 position 等于 0 說明正在從第一個圖片想最后一個滑動,那么保持 向?qū)У臓顟B(tài)為不動   if (position == 0) {    params.leftMargin = 0;//    如果滑動距離超過了 最大邊距,那么將最大邊距賦值給 紅點(diǎn)的參數(shù)左邊距   } else if (dis > totalLeftMargin) {    params.leftMargin = totalLeftMargin;//    正常情況 就將滑動的距離 直接賦值   } else {    params.leftMargin = (int) dis;   }//   設(shè)置紅點(diǎn)的 參數(shù)   dotRed.setLayoutParams(params);//    在position4左滑且左滑positionOffset百分比接近1時,偷偷替換為position1(原本會滑到position5)   if (position == welcomes.length && positionOffset > 0.99) {    mViewPager.setCurrentItem(1, false);//    在position1右滑且右滑百分比接近0時,偷偷替換為position4(原本會滑到position0)   } else if (position == 0 && positionOffset < 0.01) {    mViewPager.setCurrentItem(welcomes.length, false);   }  }  @Override  public void onPageSelected(int position) {  }  @Override  public void onPageScrollStateChanged(int state) {   switch (state) {    case 0://什么都沒做 空閑狀態(tài)     break;    case 1://正在滑動://     手動滑動 取消自動滑動     mHandler.removeCallbacks(mRunnable);     break;    case 2://滑動完畢://     繼續(xù) 自動滑動     mHandler.postDelayed(mRunnable, 3 * 1000);     break;   }  } }
// 主要的算法參考下圖 int realPosition = (position - 1 + welcomes.length) % welcomes.length; 

由下圖可以發(fā)現(xiàn),應(yīng)該初始化ViewPager.setCurrentItem(1);才能從預(yù)設(shè)的第一頁開始播放。

viewpager無限輪播,viewpager小圓點(diǎn)導(dǎo)航,viewpager自動輪播

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 天全县| 寻乌县| 灌云县| 岳阳市| 白城市| 日土县| 靖州| 弥勒县| 木兰县| 凤凰县| 阿瓦提县| 黎城县| 葫芦岛市| 平和县| 土默特左旗| 松江区| 申扎县| 大英县| 静海县| 田东县| 通道| 桃园县| 天祝| 贺兰县| 堆龙德庆县| 靖安县| 谷城县| 丘北县| 镇康县| 广宁县| 闽清县| 瑞安市| 红河县| 大连市| 合水县| 海伦市| 宁安市| 商都县| 邢台市| 余江县| 吉安市|