当前位置: 首页 > news >正文

承德网站制作加盟广西城乡和住房建设厅网站

承德网站制作加盟,广西城乡和住房建设厅网站,苏州行业网站建设费用,合肥电脑网站建站坚持原创日更#xff0c;短平快的 Android 进阶系列#xff0c;敬请直接在微信公众号搜索#xff1a;nanchen#xff0c;直接关注并设为星标#xff0c;精彩不容错过。 在 Android 开发中#xff0c;滑动冲突总是我们一个无法避免的话题。而对于解决方案却是众说纷纭。比… 坚持原创日更短平快的 Android 进阶系列敬请直接在微信公众号搜索nanchen直接关注并设为星标精彩不容错过。 在 Android 开发中滑动冲突总是我们一个无法避免的话题。而对于解决方案却是众说纷纭。比如 RecyclerView 嵌套 RecyclerView直接通过相关方法禁掉内部 RecyclerView 的滑动ScrollView 嵌套 RecyclerView 直接把 ScrollView 替换为 NestedScrollView 等等。但我们今天要说的是在自定义 View 中遇到滑动冲突时我们又应该如何处理呢 当然今天的话题需要 View 的事件分发机制做理论前提还不了解 View 的事件分发机制的小伙伴可以移步我之前面试系列的一篇文章面试系列讲讲 Android 的事件分发机制。 简单介绍 View 的事件分发机制 当然这里也可以简单地提一下基本的流程就是下面的伪代码。 public boolean dispatchTouchEvent(MotionEvent ev) {boolean consume false;if (onInterceptTouchEvent(ev)) {consume onTouchEvent(ev);}else{consume child.dispatchTouchEvent(ev);}return consume; } 当一个 ViewGroup 接收到一个事件的时候首先会调用 dispatchTouchEvent() 方法进行事件分发如果 onInterceptTouchEvent() 返回 true则代表当前 View 会拦截事件则直接回调 onTouchEvent() 方法进行事件处理。如果不拦截则直接回调子 View 的 dispatchTouchEvent() 方法如此反复一直到最里面的子 View。 当一个点击事件产生后它的传递过程遵循以下顺序Activity Window View即事件总是先传递给 ActivityActivity 再传递给 Window最后 Window 再传递给顶层 DecorView然后遵循上面的方式一直在最里层 View。 而处理事件则从最里层 View 不断回传给自己的外层 View如果一直没有 View 进行处理则直接会回传到 Activity 中。 onTouchEvent() 返回 true 代表自己要处理。 既然都提了这么一点也就突然想给出一些结论参考自 Android 开发艺术探索 同一个事件序列是指从手指接触屏幕ACTION_DOWN的那一刻起到手指离开屏幕ACTION_UP的那一刻结束中间含不定数量的 ACTION_MOVE 事件。某个 View 一旦决定拦截事件那么这一个事件序列都只能由它处理并且它的 onInterceptTouchEvent() 方法也不会再调用。换句话说比如一个 ViewGroup 里面有数个子 View一旦 ACTION_DOWN 事件从 Activity 传到这个 ViewGroup 被其拦截则后续的 MOVE 和 UP 等事件也不会传递到里面的子 View 中。如果一个 View 一旦开始处理事件如果它不消耗 ACTION_DOWN 事件即 onTouchEvent() 返回为 false那么同一事件序列中的其他事件也不会再交给它处理直接会调用其父 View 的 onTouchEvent()。如果 View 不消耗除 ACTION_DOWN 以外的其他事件那么这个点击事件会消失此时父元素的 onTouchEvent() 并不会被调用并且当然 View 可以持续收到后续的事件最终这些消失的点击事件会传递给 Activity 处理。ViewGroup 默认不拦截事件View 没有 onInterceptTouchEvent() 方法一旦有事件传递给它则直接会调用 onTouchEvent()并且起默认都会消耗掉事件。除非它是不可点击的即 clickable 和 longClickable 均为 false。View 的 longClickable 默认都为 false而 clickable 分情况比如 Button 默认为 trueTextView 默认为 false。View 的 enable 属性不会影响 onTouchEvent() 的默认返回值哪怕一个 View 是 disable 状态的只要它的 clickable 或者 longClickable 有一个为 true那么它的 onTouchEvent() 就会返回 true。requestDisallowInterceptTouchEvent() 可以在子元素中干预父元素的事件分发过程但是无法干预 ACTION_DOWN 事件。事件优先顺序setOnTouchListener() onTouchEvent() onClickListener() 一不小心发现还是挺多的当然这些都是结论具体可以跟着 面试系列讲讲 Android 的事件分发机制 进行源码流程探讨你会发现上面的结论很容易得到。 处理自定义 View 中的滑动冲突 对于大多数 Android 开发来说处理滑动冲突好像很难但实战一下又发现好像也挺简单因为这个实际上是有套路可循的。基本就两种方案外部拦截法 内部拦截法。 外部拦截法 所谓外部拦截法顾名思义就是直接在父容器中直接拦截掉我们的滑动事件让其不能进入到子元素中这似乎和我们 RecyclerView 嵌套 RecyclerView 时禁用内部 RecyclerView 滑动有那么一丝相似之处就是内部不处理就完事儿了。但细细品来又完全不一样这里的外部拦截法会让内部元素根本就收不到滑动事件。 这种方法明显非常适合我们上面讲的事件分发机制。我们在接收 ACTION_MOVE 事件的时候直接通过使 onInterceptTouchEvent() 方法返回 true 来直接拦截掉事件就可以了伪代码想必大家也知道了 override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {ev?.run { if (action MotionEvent.ACTION_MOVE 父容器需要点击事件){return true}}return super.onInterceptTouchEvent(ev) } 代码很简单我们仅仅需要在事件 ACTION_MOVE 时去处理我们的逻辑就好了当满足我们的逻辑的时候就拦截掉 ACTION_MOVE 事件给自己处理。 至于为什么不去拦截 ACTION_DOWN 和 ACTION_UP想必大家也清楚了。上面说了如果拦截了 ACTION_DOWN 事件那后续的 ACTION_MOVE、ACTION_UP 等其它事件均不会在调用 onInterceptTouchEvent() 方法会直接交给当前容器处理。而如果我们拦截掉 ACTION_UP 的话肯定会导致子元素的点击事件无法被处理因为大家肯定都知道一个点击事件从 ACTION_DOWN 开始从 ACTION_UP 结束二者缺一不可。 内部拦截法 内部拦截法相对外部拦截法会复杂一些所以我们通常来说都更加推荐用外部拦截法进行处理。不过内部拦截法依然有着它非常重要的地位具体情况有可能会遇到。 内部拦截法的话需要 requestDisallowInterceptTouchEvent() 方法的支持这个方法是干什么的呢顾名思义请求是否不允许拦截事件其接收一个 boolean 参数表示是否不允许拦截。 我们直接重写子元素的 dispatchTouchEvent() 方法得到伪代码如下 override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {ev?.run { when(action){MotionEvent.ACTION_DOWN - parent.requestDisallowInterceptTouchEvent(true)MotionEvent.ACTION_MOVE -{if(满足需要让外部容器拦截事件){parent.requestDisallowInterceptTouchEvent(false)}}}}return super.dispatchTouchEvent(ev) } 想必代码也是非常简单易懂的我们给父容器的 requestDisallowInterceptTouchEvent() 传递的参数代表是否不允许其拦截事件当参数为 true 的时候代表不允许拦截为 false 的时候代表拦截。所以看起来和外部拦截法也就如出一辙了。 不过仅仅有这点修改还不够我们通过前面的理论基础知道当我们的父容器拦截掉 ACTION_DOWN 事件的时候所有的事件都无法再传递到子元素中自然也就不会调用上面我们写的 dispatchTouchEvent() 方法了。所以我们在内部拦截法的时候还需要重写父容器的 onInterceptTouchEvent() 方法。 override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {ev?.run { if (action MotionEvent.ACTION_DOWN){return false}}return super.onInterceptTouchEvent(ev) } 至此基本介绍了两种处理滑动冲突的解决方案在自定义 View 的时候结合实际场景也就可以得心应手了。 除了滑动冲突滑动处理也是一项非常有意思的工作感兴趣的可以可以参考 NestedScrollingParent2 和 NestedScrollingChild2 哟。 文章参考自《Android 开发艺术探索》 转载于:https://www.cnblogs.com/liushilin/p/11197376.html
http://wiki.neutronadmin.com/news/96306/

相关文章:

  • 郑州定制网站建设网站免费软件下载
  • 营销网站建设公司推荐哈尔滨网站优化排名
  • wordpress一定要本地建站吗自己做网站什么类型的比较好
  • 网站建设制作首页流程汽车网站开发背景
  • 网站建设 鼠标网站服务器怎么查询
  • 嘉兴建设网站asp.net企业网站建设
  • 网站建设费用如何做账做民宿加盟哪些网站比较好
  • 郴州网站建设方案策划什么是优化网站
  • 怎么做国际货运代理外贸网站做企业网站排名
  • 南宁做网站推广nnsomapp制作程序
  • 设计公司网站制作wordpress换主题出错字幕办
  • 电子商城网站建设 模板wordpress主题图片丢失
  • 河南自助建站建设代理酷万网站建设
  • 嘉兴云推广网站如何设计个人网站
  • 福清建设银行网站电商平台项目商业计划书
  • 佛山微网站建设 天博网站后端架构如何做
  • 网站建设经典教材怎么 从头开始建设一个网站
  • wordpress网站360搜索收录内链好的网站
  • 济南网站seo报价外贸soho网站
  • 网站建设策划书主要内容网页制作实训心得
  • 无线路由器做中继手机能连接但无法访问网站wordpress软件最低要求
  • 医院建设网站中国建设教育协会的网站查询
  • 科技成果转化网站建设无远低代码开发平台
  • 火车头wordpress数据库网站优化文章怎么做
  • 太原制作公司网站老网站权重低的原因
  • 嘉定网站网站建设关键词排名优化顾问
  • 中国建设银行建银购网站网站建设专家北京注安
  • 网站建设软文模板汇天网络科技有限公司
  • 双公示 网站专栏建设企业网站备案怎么搞
  • 专业做网站关键词排名下掉网站建设的空间指的是