Android事件分发机制四:学了事件分发有什么用? (4)

接下来就可以确定我们的代码了:

public class MyScrollView extends ScrollView { ... float lastY = 0; boolean isScrollToBottom = false; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean intercept = false; int actionMarked = ev.getActionMasked(); switch (actionMarked){ case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL:{ // 这三种事件默认不拦截,必须给子view处理 break; } case MotionEvent.ACTION_MOVE:{ LinearLayout layout = (LinearLayout) getChildAt(0); ListView listView = (ListView)layout.getChildAt(1); // 如果没有滑动到底部,由ScrollView处理,进行拦截 if (!isScrollToBottom){ intercept = true; // 如果滑动到底部且listView还没滑动到顶部,不拦截 }else if (!ifTop(listView)){ intercept = false; }else{ // 否则判断是否是向下滑 intercept = ev.getY() > lastY; } break; } default:break; } // 最后记录位置信息 lastY = ev.getY(); // 调用父类的拦截方法,ScrollView需要做一些处理,不然可能会造成无法滑动 super.onInterceptTouchEvent(ev); return intercept; } ... }

代码中我还增加了如果listView下面有view的情况,判断是否滑动到底部。判断listView滑动情况和scrollView滑动情况的代码如下:

{ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 设置滑动监听 setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> { ViewGroup viewGroup = (ViewGroup)v; isScrollToBottom = v.getHeight() + scrollY >= viewGroup.getChildAt(0).getHeight(); }); } } // 判断listView是否到达顶部 private boolean ifTop(ListView listView){ if (listView.getFirstVisiblePosition()==0){ View view = listView.getChildAt(0); return view != null && view.getTop() >= 0; } return false; }

最终的实现效果如下图:

Android事件分发机制四:学了事件分发有什么用?

这样就简单地解决一个滑动冲突了。但是要注意的是,在实际问题中,往往有更加复杂的细节需要处理。而上述只是把解决滑动冲突的一个思想分析了一下,具体到业务上,还需要去细心打磨代码才行。有兴趣可以去看看NeatedScrollView是如何解决滑动冲突的源码。

最后

事件分发作为Android的基础知识储备可谓是非常重要。不能说学了事件分发,就可以直接一飞冲天。而是掌握了事件分发之后,面对一些具体的需求,就有了一定的思路去处理。或者在了解一些框架的源码的时候,懂得他这些代码是什么意思。

学习事件分发的过程中,深入研究了很多的源码,有一些小伙伴觉得没必要。实际开发中也就用到那三个主要的方法,了解一个主要的流程就足够了。我想说:确实是这样;但没有研究背后的原理,就只能知其然而不知其所以然。当遇到一些异常的情况时,就无法从源码的角度去分析结果的bug。学习源码的过程中,也是与设计android系统的作者的一种交流。倘若现在没有事件分发机制,那么我该如何去解决触摸信息的分发问题?学习的过程就是在思考android系统作者给出的解决方案。而掌握原理之后,对于事件分发的问题,稍加思考和分析,也就手到擒来了。正所谓:

只有打败10级的敌人,才能掌控9级的敌人。

希望文章对你有帮助。

要不留下个小小的点赞鼓励一下作者?

全文到此,原创不易,觉得有帮助可以点赞收藏评论转发。
笔者才疏学浅,有任何想法欢迎评论区交流指正。
如需转载请评论区或私信交流。

另外欢迎光临笔者的个人博客:传送门

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssxwz.html