当然,还分是否消费等 具体代码可以见https://github.com/2954722256/demo_event 这篇,我们一起来看下简单了解下事件冲突 还有一个简单解决事件冲突的例子 ---- requestDisallowInterceptTouchEvent..., 找到对应的方法 void requestDisallowInterceptTouchEvent(boolean disallowIntercept) Called when a child...大概就是说,当 子View 不想被 父View 拦截的时候, 就可以调用requestDisallowInterceptTouchEvent(MotionEvent)方法, 这样,可以放父View的...方法实现 public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { if (disallowIntercept...= null) { mParent.requestDisallowInterceptTouchEvent(disallowIntercept); } }
而且因为requestDisallowInterceptTouchEvent又调用了parent的函数,所以所有层次的父view都不再拦截。...的dispatchTouchEvent时,这是子view还未得到事件,所以没有设置requestDisallowInterceptTouchEvent。...,执行了requestDisallowInterceptTouchEvent,同时返回了true。...总结 通过上面的分析可以知道requestDisallowInterceptTouchEvent会让父view放开拦截,并且是向上层层生效的。...同时我们也可以通过一些逻辑控制,使requestDisallowInterceptTouchEvent只作用在部分情况下。
在Android中我们有一个方法getParent().requestDisallowInterceptTouchEvent(true);就是让view获取到对应的事件。...(true); return super.onTouchEvent(event); } else { getParent().requestDisallowInterceptTouchEvent...(true); return super.onTouchEvent(event); } else { getParent().requestDisallowInterceptTouchEvent...(true); return super.onTouchEvent(event); } else { getParent().requestDisallowInterceptTouchEvent...(true); return false; } } else { getParent().requestDisallowInterceptTouchEvent
使用父类方法requestDisallowInterceptTouchEvent(true) ,用来子View告诉父容器不要拦截我们的事件的。...31 16:04 * Email:chun_soft@qq.com * Content:viewPager和RecycleView相互冲突,将父View传到ViewPager里面 * 使用父类方法requestDisallowInterceptTouchEvent...= null){ parent.requestDisallowInterceptTouchEvent(true); } return super.dispatchTouchEvent(ev);...= null){ parent.requestDisallowInterceptTouchEvent(true); } return super.onInterceptTouchEvent(ev...= null){ parent.requestDisallowInterceptTouchEvent(true); } return super.onTouchEvent(ev); } } (
= 0) { getParent().requestDisallowInterceptTouchEvent(true);// 用getParent去请求, // 不拦截...} else {// 如果是第一个页面,需要显示侧边栏, 请求父控件拦截 getParent().requestDisallowInterceptTouchEvent(false);// 拦截...事件分发, 请求父控件及祖宗控件不要拦截事件 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { getParent().requestDisallowInterceptTouchEvent...(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN:(滑动停止的时候) getParent().requestDisallowInterceptTouchEvent...(false); } } } else {// 上下滑动 getParent().requestDisallowInterceptTouchEvent(false); }
RecyclerView时会有跳动 这个问题我在好几个作者写的滑动置顶代码那里都发现了,其他手机都是没问题的,原因是华为设备灵敏度很高,在手指放在ChildRecyclerView时很容易触发parent.requestDisallowInterceptTouchEvent..."u" -> { // 向上滑动时,始终由ChildRecyclerView处理 parent.requestDisallowInterceptTouchEvent...(false) "u" -> parent.requestDisallowInterceptTouchEvent(false) "r" -...// 右滑动到顶时,交给parent处理,使其可以滑到ViewPager下一个的position parent.requestDisallowInterceptTouchEvent...(true) } else { parent.requestDisallowInterceptTouchEvent
方法: view.requestDisallowInterceptTouchEvent(true); //传入参数是 true 即可 我第一次使用它失败的原因是: 在 我的 fragment...中,由于 viewPager 它本是就是一个 view,所以 我使用 该方法的时候,就直接 viewPager .requestDisallowInterceptTouchEvent...在子 view 中正确使用方法是 下面 ↓ 解决方法: view.requestDisallowInterceptTouchEvent(true);中使用的 view 要求是你当前 fragment...引入的xml 返回的 view,而且 改为: view.getParent().requestDisallowInterceptTouchEvent(true); 此时方能真正解决! ...1 View main = inflater.inflate(R.layout.apart_center,container,false); 1 main.getParent().requestDisallowInterceptTouchEvent
解决方案也比较简单只需要在webview的ontouch事件中调用requestDisallowInterceptTouchEvent(true)即可。...@Override public boolean onTouch(View v, MotionEvent ev) { ((WebView)v).requestDisallowInterceptTouchEvent
EditText可滚动时,则将事件交给EditText处理,即进行滚动 否则将事件交由其父类处理,即交给ScrollView进行滚动 ---- 具体实现方案 复写EditText的onTouch()并 采用 requestDisallowInterceptTouchEvent...((v.getId() == R.id.mEditText && canVerticalScroll(mEditText))) { v.getParent().requestDisallowInterceptTouchEvent...if (event.getAction() == MotionEvent.ACTION_UP) { v.getParent().requestDisallowInterceptTouchEvent
在WebView的onTouchEvent事件为ACTION_DOWN时,查找父视图是否是可以滑动的视图(如ViewPager),如果是,则通过requestDisallowInterceptTouchEvent...(true)调用,请求父视图不要拦截touchEvent 如果WebView不再响应内部滑动(即onOverScrolled中clampedX或者clampedY值为true),我们再起调用requestDisallowInterceptTouchEvent...requestDisallowInterceptTouchEvent(true) } return super.onTouchEvent(event) } override fun...requestDisallowInterceptTouchEvent(false) } super.onOverScrolled(scrollX, scrollY, clampedX,
实现思路 如下,重写子 View的dispatchTouchEvent方法,在Action_down 动作中通过方法 requestDisallowInterceptTouchEvent(true) 先请求...dealtX = 0; dealtY = 0; // 保证子View能够接收到Action_move事件 getParent().requestDisallowInterceptTouchEvent...(true); } else { getParent().requestDisallowInterceptTouchEvent(false...(true); } else { getParent().requestDisallowInterceptTouchEvent...(false); } else { //其他情况,由孩子拦截触摸事件 getParent().requestDisallowInterceptTouchEvent
context, attrs); } private boolean mIsDisallowIntercept = false; @Override public void requestDisallowInterceptTouchEvent...(boolean disallowIntercept) { // keep the info about if the innerViews do // requestDisallowInterceptTouchEvent...mIsDisallowIntercept = disallowIntercept; super.requestDisallowInterceptTouchEvent(disallowIntercept...if (ev.getPointerCount() > 1 && mIsDisallowIntercept) { requestDisallowInterceptTouchEvent...(false); boolean handled = super.dispatchTouchEvent(ev); requestDisallowInterceptTouchEvent
解决滑动冲突的根本就是要在适当的位置进行拦截,那么就有两种解决办法: 外部拦截:从父view端处理,根据情况决定事件是否分发到子view 内部拦截:从子view端处理,根据情况决定是否阻止父view进行拦截,其中的关键就是requestDisallowInterceptTouchEvent...「内部拦截法」,就是通过requestDisallowInterceptTouchEvent方法让父view不要拦截。...switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: getParent().requestDisallowInterceptTouchEvent...MotionEvent.ACTION_MOVE: if (parentCanIntercept) { getParent().requestDisallowInterceptTouchEvent...MotionEvent.ACTION_UP: break; } return super.dispatchTouchEvent(event); } requestDisallowInterceptTouchEvent
实现思路 如下,重写子 View的dispatchTouchEvent方法,在Action_down 动作中通过方法 requestDisallowInterceptTouchEvent(true) 先请求.../ 这里是够拦截的判断依据是左右滑动,读者可根据自己的逻辑进行是否拦截 if (dealtX >= dealtY) { getParent().requestDisallowInterceptTouchEvent...(true); } else { getParent().requestDisallowInterceptTouchEvent(false);...(true); } else { getParent().requestDisallowInterceptTouchEvent(false...(false); } else {//其他情况,由孩子拦截触摸事件 getParent().requestDisallowInterceptTouchEvent
当前EditText可滚动时,则将事件交给EditText处理,即进行滚动 否则将事件交由其父类处理,即交给ScrollView进行滚动 具体实现方案 复写EditText的onTouch()并 采用 requestDisallowInterceptTouchEvent...((v.getId() == R.id.mEditText && canVerticalScroll(mEditText))) { v.getParent().requestDisallowInterceptTouchEvent...if (event.getAction() == MotionEvent.ACTION_UP) { v.getParent().requestDisallowInterceptTouchEvent
其实 ViewGroup 里面有一个 requestDisallowInterceptTouchEvent 方法,传 true 的时候,相当于通知它的所有父控件不要再拦截了。...所以可以这样来处理: switch (event.getAction()) { case MotionEvent.ACTION_MOVE: requestDisallowInterceptTouchEvent...(true); break; case MotionEvent.ACTION_CANCEL: requestDisallowInterceptTouchEvent...(false); break; case MotionEvent.ACTION_UP: requestDisallowInterceptTouchEvent(false...(false); break; case MotionEvent.ACTION_UP: requestDisallowInterceptTouchEvent
switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: getParent().requestDisallowInterceptTouchEvent...= Math.abs(ev.getRawY() - latestY); if (dx > dy) { getParent().requestDisallowInterceptTouchEvent
= 0; 调用 ViewGroup 的 requestDisallowInterceptTouchEvent 方法 , 传入 boolean disallowIntercept 参数 , 用于设置是否拦截触摸事件...= null) { // 判断是否需要拦截 , 可以使用 requestDisallowInterceptTouchEvent 方法进行设置...= null) { mParent.requestDisallowInterceptTouchEvent(disallowIntercept); } }...= null) { // 判断是否需要拦截 , 可以使用 requestDisallowInterceptTouchEvent 方法进行设置...= null) { mParent.requestDisallowInterceptTouchEvent(disallowIntercept); } }
领取专属 10元无门槛券
手把手带您无忧上云