原理图:
Android最便捷banner轮播图实现原理及代码_第1张图片
代码实现

public class CyclerViewPager extends ViewPager {    public CyclerViewPager(Context context) {        super(context);    }    public CyclerViewPager(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public void addOnPageChangeListener(OnPageChangeListener listener) {        MyPageChangeListener myPageChangeListener = new MyPageChangeListener(listener);        super.addOnPageChangeListener(myPageChangeListener);    }    @Override    public void setAdapter(PagerAdapter adapter) {        //  修正  adapter 中position        MyAdapter myAdapter = new MyAdapter(adapter);        addOnPageChangeListener(null); //手动增加一个监听        super.setAdapter(myAdapter);        setCurrentItem(1);        //开启自动轮播        startScroll();//自动轮播    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        //手指触摸  按下 停止轮播  抬起继续轮播        switch (ev.getAction()){            case MotionEvent.ACTION_DOWN:                stopScroll();                break;            case MotionEvent.ACTION_MOVE:                break;            case MotionEvent.ACTION_CANCEL://取消事件            case MotionEvent.ACTION_UP:                startScroll();                break;        }        return super.onTouchEvent(ev);    }    Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            int currentItem = getCurrentItem();            currentItem ++;            setCurrentItem(currentItem);            handler.sendEmptyMessageDelayed(1, 4000);//4s发送消息        }    };    public void startScroll() {        //开启轮播        handler.sendEmptyMessageDelayed(1, 4000);//4s发送消息    }    public void stopScroll(){        handler.removeMessages(1);    }    public class MyPageChangeListener implements OnPageChangeListener {        private OnPageChangeListener listener;        private int position;        public MyPageChangeListener(OnPageChangeListener listener) {            this.listener = listener;        }        @Override        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            if (listener != null)                listener.onPageScrolled(position, positionOffset, positionOffsetPixels);        }        @Override        public void onPageSelected(int position) {            this.position = position;            if (listener != null)                listener.onPageSelected(position);        }        @Override        public void onPageScrollStateChanged(int state) {            //状态改变的时候 调用    手指抬起的时候切换            if (state == ViewPager.SCROLL_STATE_IDLE) {                //空闲切换                // 页面切换   自动的切换到对应的界面    最后一个A----->第一个A                if (position == getAdapter().getCount() - 1) {                    //最后一个元素  是否平滑切换                    setCurrentItem(1, false);                } else if (position == 0) {                    //是第一个元素{D] ----> 倒数第二个元素[D]                    setCurrentItem(getAdapter().getCount() - 2, false);                }            }            if (listener != null)                listener.onPageScrollStateChanged(state);        }    }    public class MyAdapter extends PagerAdapter {        private PagerAdapter adapter;        public MyAdapter(PagerAdapter adapter) {            this.adapter = adapter;  //[ABCD]        }        @Override        public Object instantiateItem(ViewGroup container, int position) {            //  position 已经是 [DABCDA] 的索引了            // 修正后的索引 应该是 [ABCD]的索引            //修正position            if (position == 0) { //新增的D                position = adapter.getCount() - 1;// 最后一个元素            } else if (position == getCount() - 1) {  //最后一个元素 A                position = 0;            } else {                position -= 1; //计算新的索引            }            return adapter.instantiateItem(container, position);        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            adapter.destroyItem(container, position, object);        }        @Override        public int getCount() {            return adapter.getCount() + 2;        }        @Override        public boolean isViewFromObject(View view, Object object) {            return adapter.isViewFromObject(view, object);        }    }}

更多相关文章

  1. cvc-complex-type.2.4.d: 发现了以元素 'd:skin' 开头的无效内容
  2. android 移除remove元素
  3. android recovery模式选项中索引改进
  4. Android中的元素定位
  5. Android UI元素使用初步
  6. 【Android】viewpager banner 广告 自动轮播 小圆点
  7. android 主题元素映射方式

随机推荐

  1. 从零开始的Android新项目2 - Gradle篇
  2. 如何在Android设备上读取CPU频率
  3. Android(监听+回调=观察者)模式从Dialog到A
  4. [置顶] android加密解密算法之3DE
  5. Android 中文件类型与MIME的匹配表
  6. 实战Andriod开发环境部署
  7. Android Studio 项目的导入以及依赖
  8. Material Design控件使用详解
  9. android OSChina 客户端源代码剖析
  10. android通知适用于循环中的一个对象[重复