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

在网上看到很多利用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);

        }else if(viewPager.getCurrentItem()==0&& positionOffsetPixels==0) {
          viewPager.setCurrentItem(imgList.length-2, false);

        }

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

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

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

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

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

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

(0)

相关推荐

  • Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件

    最近用到需要无限轮播自动播放的轮播轮播图,网上感觉都有这样那样的问题,于是自己写了一个通用的控件CarouselFigureView. 特点: 1.可以轮播view可以自己定义,不一定是要是ImageView2.指示器默认显示,但是可以隐藏3.可以设置指示器的颜色.间距.大小 4.有基础的可以自己修改代码改变指示器位置,这个应该不难5.可以自己开启和关闭自动轮播,开启轮播的时候可以设置轮播时间间隔,默认3000毫秒 我们先来看看效果图: 然后来看看使用代码 xml代码 <?xml version

  • Android ViewPager实现轮播图效果

    先上一张效果图: 说到ViewPager实现轮播图效果,那么肯定会用到PagerAdapter,下面先介绍下这个类. PagerAdapter简介 PagerAdapter是Android.support.v4包中的类,是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. PagerAdapter主要是viewpager的适配器,而viewPager则也是在android.support.v4扩展包中新添加的一个强大的控件

  • Android 使用ViewPager实现左右循环滑动及轮播效果

    ViewPager是一个常用的Android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其他页面的信息. 循环滑动效果的实现:PagerAdapter 我们知道ViewPager自带的滑动效果非常出色,因此我们基本不需要处理这个滑动,只处理内容的显示.而内容的显示是由

  • Android中用RxJava和ViewPager实现轮播图

    前言 很多人要实现轮播图都会想到使用ViewPager + Handler来完成轮播图的效果.但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了. 下面我们就来介绍如何实现RxJava+ViewPager的轮播图. 效果图如下 ViewPager的操作 说到ViwePager应该大家都不陌生,它可以结合普通的View也可以结合Fragment一起使用.在此我也就不对它的使用方法进行过多的介绍了.直接开始介绍轮播的方法. 常见的轮播操作 private

  • Android使用ViewPager实现自动轮播

    很多APP中都实现了类似引导页的自动轮播,不由得想到昨天的引导页上修改一下代码实现轮播. 其实大体上只需要添加一个线程循环执行就可以了. 项目已同步至:https://github.com/nanchen2251/viewpagerDemo 同样的先上图 直接上代码,注释都全的,我想这样更有利于理解. 先改了Adapter  package com.example.nanchen.taketurnplaydemo; import android.support.v4.view.PagerAdap

  • Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie

  • Android ViewPager实现图片轮播效果

    在app中图片的轮播显示可以说是非常常见的实现效果了,其实现原理不过是利用ViewPager,然后利用handler每隔一定的时间将ViewPager的currentItem设置为当前item的position+1即可.先来看看效果图吧: 就是实现这样的一个轮播广告的效果. 因为这个是自己为了练习仿照某旅游类App做的,所以这里的数据是使用抓包工具抓取的,准备数据等工作就不在这里赘述了,反正数据的添加大体都是相同的.我的思路是这样的,从网络上实时的获取数据(当然你也可以将数据写死),然后通过网络

  • Android使用ViewPager加载图片和轮播视频

    作为Android基础组件之一,大家对viewpager已经很熟悉了,网上也有很多使用viewpager来加载图片的案例.但是像微信那样点击图片,可以轮播显示图片和视频的例子却没找到.正巧项目中有需求,可以就花时间写了下,现在给一下核心代码,希望对有此需求的同学们起一个抛砖引玉的作用.话不多说了,上代码: 以下是initData的代码 public void initData() { //把聊天界面的图片和视频找出来,并加到数组中,并在 //并根据传进来的position来找到视频或图片在数组中

  • Android实现带指示器的自动轮播式ViewPager

    前言 最近在做项目的时候,有个需求就是实现自动轮播式的ViewPager,最直观的例子就是知乎日报顶部的ViewPager,它内部有着好几个子view,每个一段时间便自动滑动到下一个item view,而底部的指示器也随之跟着改变.使用这种ViewPager的好处是在有限的空间内可以展示出多样化的信息.轮播式ViewPager广泛应用于各种应用内部,用于展示广告等.抱着学习和分享的目的,笔者把轮播式ViewPager写成了一个独立的控件,以方便以后的使用. 效果展示 话不多说,我们先来看看实现的

  • Android 使用ViewPager自动滚动循环轮播效果

    对Android 利用ViewPager实现图片可以左右循环滑动效果,感兴趣的朋友可以直接点击查看内容详情. 主要介绍如何实现ViewPager自动播放,循环滚动的效果及使用.顺便解决ViewPager嵌套(ViewPager inside ViewPager)影响触摸滑动及ViewPager滑动速度设置问题. 先给大家展示下效果图,喜欢的朋友可以下载源码: 1.实现 没有通过ScheduledExecutorService或Timer定期执行某个任务实现,而是简单的通过handler发送消息去

随机推荐