banner和viewpager联动发生点击机制探讨。

项目中使用了banner和Viewpager联动的一个问题。
其中的banner是采用的最火的。https://github.com/youth5201314/banner
事情起因:
如效果图:viewpager内部每个都有一个banner,当banner滑动到最后一条后,会出发ViewPager的滑动事件,导致viewpager切换到电影页面。老板的意思是不能滑动到电影页,只在本页中滑动。
解决方案:
public class Mybanner extends Banner {
public Mybanner(@NonNull Context context) {
super(context);
}
public Mybanner(@NonNull Context context, @NonNull AttributeSet attrs) {
super(context, attrs);
}
public Mybanner(@NonNull Context context, @NonNull AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
float startY = 0;
float startX = 0;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
startY = ev.getY();
startX = ev.getX();
break;
case MotionEvent.ACTION_MOVE:
float y = ev.getY();
getParent().requestDisallowInterceptTouchEvent(Math.abs((int) (startY - y)) < 50);
break;
case MotionEvent.ACTION_UP:
break;
default:
}
return super.onInterceptTouchEvent(ev);
}
}
判断为横向move事件的时候,getParent().requestDisallInterceptRouchEvent(true) 让父布局禁用拦截事件功能。即滑动的时候,viewpager不拦截事件,就谈不上处理事件了。
了解到事件从ViewGroup向子View分发的过程中,需要走一个判断,如果这个判断语句没有过,那么事件将被父布局给拦截掉,这个判断语句是:
if(disallowIntercept || !onInterceptTouchEvent(ev))
其中disallowIntercept这个标志表示是否禁用事件拦截功能,默认情况都是false,所以一般情况下,是否拦截事件就得看后面的!onInterceptTouchEvent(ev) 这个语句的正负值了,假设我们把这里的onInterceptTouchEvent(ev) 重写并始终返回为true,那么子view将会永远得不到事件的分发,所有的事件都会被ViewGroup拦截。
平时开发过程中可能会有这种需求:在触控的时候,按下那下(ACTION_DOWN)需要子View进行事件反馈,但在滑动(ACTION_MOVE)或者抬起(ACTION_UP)的时候需要父布局进行拦截操作,这个时候就要用到我们的requestDisallInterceptRouchEvent(boolean disallowIntercept)方法了,该方法可以在子类通过调用getParent().requestDisallInterceptRouchEvent(true) 来让父布局禁用拦截事件功能,从而父布局忽略该事件之后的一切Action
初级阶段:注意这些相关的返回中,一旦是true代表的就是需要。此控件需要。
一旦父View的onInterceptTouchEvent down返回的是true,则子view无法拿到down事件,整个事情和子view就没有任何关系了。
如果,父View的onInterceptTouchEvent down返回的是false,那么子View的拦截中down事件走,此处,设置: getParent().requestDisallowInterceptTouchEvent(true); 则代表父类失去拦截功能。父类的move up方法都将无法起作用,即便他设置为true。
参考链接:
https://blog.csdn.net/qq_34795285/article/details/61200211