自定义轮播图

先看效果图:

实现

viewpager +handler 实现

  • 首先定义一个类集成自Runnalbe

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class AutoScrollTask implements Runnable {
    /**
    * 开始轮播
    */
    public void start() {
    UIUtils.postTaskDelay(this, 2000);
    }
    /**
    * 停止轮播
    */
    public void stop() {
    UIUtils.removeTask(this);
    }
    @Override
    public void run() {
    int currentItem = mViewPager.getCurrentItem();
    currentItem++;
    mViewPager.setCurrentItem(currentItem);
    //结束后递归 ,再次开始 继续执行
    start();
    }
    }
  • 然后viewpager的adapter(这里也可以用cycleviewpager)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    private class PictureAdapter extends PagerAdapter {
    @Override
    public int getCount() {
    if (mDatas != null) {
    return Integer.MAX_VALUE;
    }
    return 0;
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
    return view == object;
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
    position = position % mDatas.size();
    ImageView iv = new ImageView(UIUtils.getContext());
    ImageLoaderUtils.display(UIUtils.getContext(), iv, Constants.URLS.IMAGEBASEURL + mDatas.get(position));
    container.addView(iv);
    return iv;
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
    }
    }
  • 接下来启动任务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //设置viewpager的初始点和能够一直向左滑动
    int diff = Integer.MAX_VALUE / 2 % mDatas.size();
    int index = Integer.MAX_VALUE / 2;
    mViewPager.setCurrentItem(index - diff);
    // 自动轮播
    final AutoScrollTask scrollTask = new AutoScrollTask();
    scrollTask.start();
    //停止轮播是 用户按下的时候停止
    mViewPager.setOnTouchListener(new View.OnTouchListener() {
    //这里也需要判断下 最小滑动距离。是滑动还是点击
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    scrollTask.stop();
    break;
    case MotionEvent.ACTION_MOVE:
    break;
    case MotionEvent.ACTION_UP:
    scrollTask.start();
    break;
    }
    return false;
    }
    });

一些工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 延迟执行
*
* @param task
* @param delay 延迟多久
*/
public static void postTaskDelay(Runnable task, int delay) {
getMainThreadHandler().postDelayed(task, delay);
}
/**
* 移除任务
* @param task
*/
public static void removeTask(Runnable task) {
getMainThreadHandler().removeCallbacks(task);
}
/**
* 得到主线程 的handler
*
* @return
*/
public static Handler getMainThreadHandler() {
return BaseApplication.getmMainHandler();
}
这个在自定义application
public static Handler getmMainHandler() {
return mMainHandler;
}