android ViewPager实现自动无限轮播和下方向导圆点

android ViewPager实现自动无限轮播和下方向导圆点,第1张

概述一、布局小圆点形状的生成shape.xml文件使用空心还是实心的把对应的注释去掉就可以了.

一、布局

小圆点形状的生成shape.xml文件

使用空心还是实心的把对应的注释去掉就可以了.

<?xml version="1.0" enCoding="utf-8"?><shape xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:shape="oval" androID:useLevel="false"> <!-- 实心圆   <solID androID:color="#F00"/> --> <!-- 空心圆   <stroke   androID:wIDth="1dp"   androID:color="@androID:color/black"/> --> <size androID:wIDth="8dp" androID:height="8dp"/></shape>

轮播的VIEwPager和向导圆点的 布局文件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/ho@R_419_6135@b_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; } //  //返回实际要显示的图片数+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;//    设置背景图片  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

/**  * 循环轮播界面change的 监听器  */ 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);  }  /**   * 当页面在滑动了调用   *   * @param position    当前页面,即点击滑动的页面   * @param positionOffset  当前页面偏移的百分比   * @param positionOffsetPixels 当前页面偏移的像素位置   */  @OverrIDe  public voID onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {//   获取到 真正图片所在的位置.   int realposition = (position - 1 + welcomes.length) % welcomes.length;//   获取到红点 的 layout 参数   relativeLayout.LayoutParams params = (relativeLayout.LayoutParams) dotRed.getLayoutParams();//   计算两个点之间的距离   int dotdis = mLlDot.getChildAt(1).getleft() - mLlDot.getChildAt(0).getleft();//   计算总共的左边距   int totalleftmargin = (welcomes.length - 1) * dotdis;   // 计算滑动的距离   float dis = realposition * dotdis + positionOffset * dotdis;//   设置 margin_left 的值,//   如果 position 等于 0 说明正在从第一个图片想最后一个滑动,那么保持 向导的状态为不动   if (position == 0) {    params.leftmargin = 0;//    如果滑动距离超过了 最大边距,那么将最大边距赋值给 红点的参数左边距   } else if (dis > totalleftmargin) {    params.leftmargin = totalleftmargin;//    正常情况 就将滑动的距离 直接赋值   } else {    params.leftmargin = (int) dis;   }//   设置红点的 参数   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://什么都没做 空闲状态     break;    case 1://正在滑动://     手动滑动 取消自动滑动     mHandler.removeCallbacks(mRunnable);     break;    case 2://滑动完毕://     继续 自动滑动     mHandler.postDelayed(mRunnable,3 * 1000);     break;   }  } }
// 主要的算法参考下图 int realposition = (position - 1 + welcomes.length) % welcomes.length; 

由下图可以发现,应该初始化VIEwPager.setCurrentItem(1);才能从预设的第一页开始播放。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的android ViewPager实现自动无限轮播和下方向导圆点全部内容,希望文章能够帮你解决android ViewPager实现自动无限轮播和下方向导圆点所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存