1. 程式人生 > >Android最便捷banner輪播圖實現原理及程式碼

Android最便捷banner輪播圖實現原理及程式碼

原理圖:
這裡寫圖片描述
程式碼實現

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); } } }