Android最便捷banner輪播圖實現原理及程式碼
阿新 • • 發佈:2019-02-03
原理圖:
程式碼實現
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);
}
}
}