viewpager自动循环滑动和手动滑动(手动滑动后自动滑动延后处理)

来源:互联网 发布:淘宝怎么看别人的销量 编辑:程序博客网 时间:2024/06/11 06:17
public class RollViewPager extends ViewPager {


private int currentItem;
private final int ROLL_DURATION = 3000;
private boolean mIsChanged = false;
private ArrayList<ImageView> dots;// 点的位置不固定,所以需要让调用者传入
private ViewPagerTask viewPagerTask;
private RollViewPagerAdapter adapter;


public RollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
if (viewPagerTask == null)
viewPagerTask = new ViewPagerTask();
}


public RollViewPager(Context context) {
super(context);
if (viewPagerTask == null)
viewPagerTask = new ViewPagerTask();
}


/**
* 必须调用

* @param isAutoRoll
* @param adapter
*/
// rollViewPager.init(false, null, rollViewPagerAdapter);
public void init(boolean isAutoRoll, ArrayList<ImageView> dots, RollViewPagerAdapter adapter) {
this.dots = dots;
this.adapter = adapter;


setOnPageChangeListener(new SimpleOnPageChangeListener());
setAdapter(adapter);
if (isAutoRoll)
handler.postDelayed(viewPagerTask, ROLL_DURATION);
}


private OnViewPagerChangeListener onViewPagerChangeListener;


public void setOnViewPagerChangeListener(OnViewPagerChangeListener onViewPagerChangeListener) {
this.onViewPagerChangeListener = onViewPagerChangeListener;
}


public class ViewPagerTask implements Runnable {
@Override
public void run() {
if (adapter.getCount() > 0) {
long offTime =System.currentTimeMillis()-currentTimeMillis;
Log.e("handleMessage offTime", offTime+"");
if(offTime>2200)
currentItem = (currentItem + 1) % adapter.getCount();
handler.obtainMessage().sendToTarget();
}
}
}


private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
setCurrentItem(currentItem);
handler.postDelayed(viewPagerTask, ROLL_DURATION);


}
};


private long currentTimeMillis=0;
class SimpleOnPageChangeListener implements OnPageChangeListener {
int oldPosition = 0;


@Override
public void onPageSelected(int position) {
currentTimeMillis = System.currentTimeMillis();

mIsChanged = true;
currentItem = position;
if (dots != null && dots.size() > 0) {
if (position >= dots.size()) {
Log.e("onPageSelected", "onPageSelected error");
currentItem = 0;
dots.get(0).setBackgroundResource(R.drawable.dot_focus);
return;
}
dots.get(position).setBackgroundResource(R.drawable.dot_focus);
dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);
if (position == 1) {
dots.get(0).setBackgroundResource(R.drawable.dot_normal);
}
}
oldPosition = position;
if (onViewPagerChangeListener != null)
onViewPagerChangeListener.onPageSelected(position);
}


@Override
public void onPageScrollStateChanged(int pState) {


if (ViewPager.SCROLL_STATE_IDLE == pState) {
if (mIsChanged) {
mIsChanged = false;
RollViewPager.this.setCurrentItem(currentItem, false);
}
}
}


@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
}


public interface OnViewPagerChangeListener {
void onPageSelected(int position);
}


@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
handler.removeCallbacksAndMessages(null);
}
}
0 2