解决思路主要是复写了ViewPager中的dispatchTouchEvent函数,然后在分发之前,先自己做点事情,具体代码如下:
package com.xiaowu.banner.demo;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
public class MyViewPager extends ViewPager {
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
// @Override
// public boolean onInterceptTouchEvent(MotionEvent arg0) {
// return true;
// }
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
if (listener != null) {
listener.onTouchDown();
}
break;
case MotionEvent.ACTION_UP:
if (listener != null) {
listener.onTouchUp();
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
private OnViewPagerTouchEvent listener;
public void setOnViewPagerTouchEventListener(OnViewPagerTouchEvent l){
listener = l;
}
public interface OnViewPagerTouchEvent{
void onTouchDown();
void onTouchUp();
}
}
具体使用的地方示例:
((MyViewPager)adViewPager).setOnViewPagerTouchEventListener(new MyViewPager.OnViewPagerTouchEvent() {
@Override
public void onTouchUp() {
Log.d(TAG, "action up");
startAd();
}
@Override
public void onTouchDown() {
Log.d(TAG, "action down");
mainHandler.removeCallbacks(scrollTask);
}
});
其实这里还有一个有弊端的思路,也可以响应onTouchListener,实现思路是这样子的,依然是从事件分发的角度分析,伪代码如下:
//首先进入分发环节
dispatchTouchEvent() {
//进入dispatchTouchEvent方法
//判断当前对象的返回值,true - 进行分发(拦截、处理);false - 不进行分发,直接丢弃
if(dispatch== true) {
//进入onInterceptTouchEvent方法
//其次判断当前onInterceptTouchEvent的返回值(是否被拦截)
if(Intercept== false) {
//没被拦截,得到此ViewGroup的全部子类:
for (int i = count - 1; i >= 0; i--){
//获取子View(Group)对象,对其进行分发检查
final View child = children[i];
child.dispatchTouchEvent(this){···};
}
} else {
//进入onTouchEvent方法 //如果ViewGroup被打断
(onInterceptTouchEvent返回true),或者当前为最内(顶)层的纯View
onTouchEvent();
}
} else {
//将返回标志false的MotionEvent对象统统丢弃
}
}
复写ViewPager中的onInterceptTouchEvent函数,直接返回true
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return true;
}
然后给ViewPager设置onTouchListener就可以监听到事件了,代码如下:
adViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "action down");
tryCancelAd();
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "action up");
startAd();
break;
default:
break;
}
return false;
}
});
但是这样子会有致命的问题,每一个item都无法再接收事件了,所以这个实现方式真的是然并卵。。。。。。
纯粹当作是对事件分发机制的复习吧