Android实现viewpager实现循环轮播效果

Android实现viewpager实现循环轮播效果,第1张

概述在网上看到很多利用viewpager实现轮播都是通过设置一个很大的值,让viewpager开始显示在这个数值区间的中间,但这种轮播个人感觉不是真正的轮播,因此自己实现了一个轮播的效果。大致思路是这样的,假如有5张图adcde

在网上看到很多利用vIEwpager实现轮播都是通过设置一个很大的值,让vIEwpager开始显示在这个数值区间的中间,但这种轮播个人感觉不是真正的轮播,因此自己实现了一个轮播的效果。大致思路是这样的,假如有5张图adcde是要轮播展示的,这时创建一个新的集合eadcdea,然后再让vIEwpager设置当前展示第一张图,也就是显示a。这样当往左滑时显示的是e,此时设置vIEwpager.setCurrentItem(5),当右滑到e的时候在往右滑,此时设置vIEwpager.setCurrentItem(1),这样就实现了轮播效果。

效果图如下所示:

话不多说上一下代码:

/** * vIEwpager切换页面时动画 */public class MainActivity extends AppCompatActivity {  private VIEwPager vIEwPager;  private VIEwPaagerAdapter adapter;  private ArrayList<VIEw> vIEwList=new ArrayList<>();//承载图片  private ArrayList<TextVIEw> tvList=new ArrayList<>();//底部圆点集合  private int []imgList={R.drawable.img8,R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4,R.drawable.img5,R.drawable.img6,R.drawable.img7,R.drawable.img8,R.drawable.img1};//图片数组  boolean isstop=false;  private linearLayout line;//小圆圈父视图  private ScheduledThreadPoolExecutor executor;  private int currentPage;  private Handler handler=new Handler(){    @OverrIDe    public voID handleMessage(Message msg) {      super.handleMessage(msg);      switch (msg.what) {        case 1:          vIEwPager.setCurrentItem(msg.arg1);          break;        default:          break;      }    }  };  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    supportRequestwindowFeature(Window.FEATURE_NO_Title);    setContentVIEw(R.layout.activity_main);    vIEwPager= (VIEwPager) findVIEwByID(mybanner_vIEwpager);    line= (linearLayout) findVIEwByID(R.ID.line);    setVIEw();//设置轮播显示的底图    adapter=new VIEwPaagerAdapter(this,vIEwList);    vIEwPager.setAdapter(adapter);    vIEwPager.setCurrentItem(1);    vIEwPager.setoffscreenPagelimit(10);//加这个是为了防止第一张往左滑动会出现闪烁    startService();//启动轮播    vIEwPager.addOnPagechangelistener(new VIEwPager.OnPagechangelistener() {      @OverrIDe      public voID onPageScrolled(final int position,float positionOffset,int positionOffsetPixels) {        Log.i("tag","位置"+position+"positionOffset"+positionOffset+"positionOffsetPixels"+positionOffsetPixels);        Log.i("tag","weizhi"+vIEwPager.getCurrentItem());        if (position==imgList.length-1) {          vIEwPager.setCurrentItem(1,false);        }else if(vIEwPager.getCurrentItem()==0&& positionOffsetPixels==0) {          vIEwPager.setCurrentItem(imgList.length-2,false);        }        currentPage=vIEwPager.getCurrentItem();      }      @OverrIDe      public voID onPageSelected(final int position) {        Log.i("tag","位置wwwww"+position);        setEnbale();        if (position==imgList.length-1) {          tvList.get(0).setEnabled(true);        }        else if (position==0) {          tvList.get(imgList.length-3).setEnabled(true);        }        else{          tvList.get(position-1).setEnabled(true);        }      }      @OverrIDe      public voID onPageScrollStateChanged(int state) {      }    });  }  public voID setVIEw() {    linearLayout.LayoutParams params=new linearLayout.LayoutParams(15,15);    params.leftmargin=10;    params.rightmargin=10;    for (int i = 0; i < imgList.length; i++) {      VIEw vIEw= LayoutInflater.from(this).inflate(R.layout.layout,null,false);      ImageVIEw img= (ImageVIEw) vIEw.findVIEwByID(R.ID.img);      img.setBackgroundResource(imgList[i]);      TextVIEw textVIEw= (TextVIEw) vIEw.findVIEwByID(R.ID.tv);      textVIEw.setText(i+"");      vIEwList.add(vIEw);    }    for (int i = 0; i < imgList.length-2; i++) {      TextVIEw vIEw=new TextVIEw(this);      vIEw.setBackgroundResource(R.drawable.item);      vIEw.setLayoutParams(params);      vIEw.setEnabled(false);      line.addVIEw(vIEw);      tvList.add(vIEw);    }    tvList.get(0).setEnabled(true);  }  public voID setEnbale(){    for (TextVIEw tvcycle: tvList) {      tvcycle.setEnabled(false);    }  }  /**   * 启动线程池开启循环任务   */  public voID startService(){    executor=new ScheduledThreadPoolExecutor(1);    executor.scheduleWithFixedDelay(runnable,1,2,TimeUnit.SECONDS);  }  /**   * 停止任务   */  public voID stopService(){    executor.shutdown();  }  Runnable runnable=new Runnable() {    @OverrIDe    public voID run() {      currentPage=currentPage+1%10;      Message message= Message.obtain();      message.what=1;      message.arg1=currentPage;      handler.sendMessage(message);    }  };  @OverrIDe  protected voID onDestroy() {    super.onDestroy();    stopService();  }}

实现轮播的重点在这:

 if (position==imgList.length-1) {          vIEwPager.setCurrentItem(1,false);        }

这里解释一下onPageScrolled里三个参数的含义,第一个position,这个参数要特别注意一下。当用手指滑动时,如果手指按在页面上不动,position和当前页面index是一致的;如果手指向左拖动(相应页面向右翻动),这时候position大部分时间和当前页面是一致的,只有翻页成功的情况下最后一次调用才会变为目标页面;如果手指向右拖动(相应页面向左翻动),这时候position大部分时间和目标页面是一致的,只有翻页不成功的情况下最后一次调用才会变为原页面。

当直接设置setCurrentItem翻页时,如果是相邻的情况(比如现在是第二个页面,跳到第一或者第三个页面),如果页面向右翻动,大部分时间是和当前页面是一致的,只有最后才变成目标页面;如果向左翻动,position和目标页面是一致的。这和用手指拖动页面翻动是基本一致的。

如果不是相邻的情况,比如我从第一个页面跳到第三个页面,position先是0,然后逐步变成1,然后逐步变成2;我从第三个页面跳到第一个页面,position先是1,然后逐步变成0,并没有出现为2的情况。

positionOffset是当前页面滑动比例,如果页面向右翻动,这个值不断变大,最后在趋近1的情况后突变为0。如果页面向左翻动,这个值不断变小,最后变为0。positionOffsetPixels是当前页面滑动像素,变化情况和positionOffset一致。

这里采用线程池开启了一个循环任务,线程池的好处不说了,好了到此为止大概实现了vIEwpager的轮播了。

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

您可能感兴趣的文章:Android使用ViewPager加载图片和轮播视频Android ViewPager实现轮播图效果Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件Android实现带指示器的自动轮播式ViewPagerAndroid 使用ViewPager实现左右循环滑动及轮播效果Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果Android中用RxJava和ViewPager实现轮播图Android ViewPager实现图片轮播效果Android使用ViewPager实现自动轮播Android 使用ViewPager自动滚动循环轮播效果 总结

以上是内存溢出为你收集整理的Android实现viewpager实现循环轮播效果全部内容,希望文章能够帮你解决Android实现viewpager实现循环轮播效果所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存