一下内容,仅为记录学习笔记,不代表内容完全正确。
这个需要在viewpager的 分发事件中做处理
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);
downX = ev.getX();
downY = ev.getY();
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
float moveX = ev.getX();
float moveY = ev.getY();
if (Math.abs(moveX - downX) > Math.abs(moveY - downY)) {
getParent().requestDisallowInterceptTouchEvent(true);
} else {
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
}
return super.dispatchTouchEvent(ev);
}
我们一般会有这个需求,(viewpager一般都会有定时切换功能),那么我们在长按viewpager时,就不需要它自动切换了,那么怎么获取它的长按事件呢(怎么获取点击时间呢),viewpager是没有长按和点击事件的。
所以,一般需要处理它的onTouch()方法,从它的方法中自己分离出长按,点击事件。
private class MyOnTouchListener implements OnTouchListener {
private long startCurrentTimeMillis;
private float touchDownX;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
handler.removeCallbacksAndMessages(null);
startCurrentTimeMillis = System.currentTimeMillis();
touchDownX = event.getX();
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_UP:
long duration = System.currentTimeMillis() - startCurrentTimeMillis;
float touchUPX = event.getX();
if(duration < 500 && touchUPX == touchDownX){
mMyPagerOnClickListener.OnPagerClickListener(mCurrentPosition);
}
start();
break;
case MotionEvent.ACTION_MOVE:
break;
}
return true;
}
}
下面看看start方法是如何是现代:
private boolean has_adapter = false;
public void start() {
if (!has_adapter) {
has_adapter = true;
ViewPagerAdapter pagerAdapter = new ViewPagerAdapter();
RollViewPager.this.setAdapter(pagerAdapter);
RollViewPager.this
.setOnPageChangeListener(new MyOnPageChangeListener());
}
// 每隔5秒钟发送一个延迟任务
handler.postDelayed(task, 5000);
}
看看task是什么:
public class Task implements Runnable {
@Override
public void run() {
mCurrentPosition = (mCurrentPosition + 1) % mImageUrlLists.size();
handler.obtainMessage().sendToTarget();
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
RollViewPager.this.setCurrentItem(mCurrentPosition);
start();
}
};