AndroidTouch事件:(简单做个了解)
- dispatchTouchEvent()事件分发
默认返回false,不做处理继续分发事件,返回true,做处理不分发事件
- onInterceptTouchEvent()事件拦截
默认返回false,不做处理继续执行,返回true,做处理拦截事件
- onTouchEvent事件消费
默认返回false,不做处理继续传递,返回true,做处理终止传递
接下来解决一下ViewPager嵌套冲突问题:
自定义一个类MyViewPager_NoScroll继承ViewPager
最后用类的全路径名代替内部控件的ViewPager
要将MyViewPager_NoScroll用在子ViewPager里(内层)
<com.xxb.demo.frag.MyViewPager_NoScroll android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="wrap_content"/>
下面是MyViewPager_NoScroll得代码:
/**
* Description:解决ViewPager嵌套滑动冲突
*/
public class MyViewPager_NoScroll extends ViewPager {
//重写构造方法
public MyViewPager_NoScroll(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 重写事件拦截方法,返回true,执行拦截
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
super.onInterceptTouchEvent(ev);
return true;
}
/**
* 重写事件消费方法
* @param ev
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
//判断子item总个数不大于1,TouchEvent返回默认值,继续消费。
if (getChildCount() <= 1) {
super.onTouchEvent(ev);
}
//获取事件
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN://按下
if (getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true); //让事件不再分发
}
break;
case MotionEvent.ACTION_MOVE://移动
if (getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true); //让事件不再分发
}
break;
case MotionEvent.ACTION_CANCEL://非人工操作
if (getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true); //让事件不再分发
}
break;
case MotionEvent.ACTION_UP://抬起
if (getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true); //让事件不再分发
}
break;
}
return true; //让事件不再分发
}
}
了解Android事件分发:https://www.jianshu.com/p/6baa9b2790d5