解答如何看待信仰这个问题。

爱卡汽车_中国领先的汽车主题社区、汽车资讯、汽车论坛中心你的android事件传递知识能解答这个问题? - 简书
你的android事件传递知识能解答这个问题?
突然想看看android 下拉刷新源码的实现,其中有scroller的运用,找到了郭霖大神几年前写的一个scroller简化版的viewPager 例子,照着例子敲了一遍,大致意思上在一个viewgroup上摆放一排view,根据滑动的距离调用viewGroup的scrollerby滑动,我在这个viewGroup上随意的放上了TextView,布局如下:
FDBEA756-8753-4DFF-95B4-165E047EE332.png
滑动了半天却是没有响应滑动事件.
布局很简单就不贴了,有需要的同学可以看下搜下郭神的这篇文章《Android Scroller完全解析,关于Scroller你所需知道的一切》,随意在button上点击后,log日志如下:
07-14 17:44:07.009 /com.tomchen.zoom E/ScrollerViewGroup: dispatchTouchEvent0
07-14 17:44:07.009 /com.tomchen.zoom E/ScrollerViewGroup: onInterceptTouchEvent0
07-14 17:44:07.010 /com.tomchen.zoom E/TButton: dispatchTouchEvent0
07-14 17:44:07.011 /com.tomchen.zoom E/TButton: onTouchEvent0
07-14 17:44:07.011 /com.tomchen.zoom E/ScrollerViewGroup: onTouchEvent0
有兴趣的同学可以试试在其他地方点一点,结果也会一致,就是没有调用后续的ACTION_MOVE,ACTION_UP,跳回到viewGroup的onTouchEvent后事件就被掐掉了,为什么呢。
网上事件传递的文章很多,《3副图看清事件传递》...,我都快倒背如流。还有些用了很长的篇幅来讲解,看得我似懂非懂,也有人直接给出了答案,给子元素设置clickable=true。
如果你能说清楚为什么,并且能用其他方式解决这个问题就不用往下看啦。
我的android 安装了 sdk 23的 sourceCode,在android studio 上能直接查看源码 java文件,如果还有人下载sdk比较困难,这里介绍一个不用翻墙的方式下载 最新android studio和sdk的方式,点,然后就能在android studio上直接设置断点查看源码啦。
这里先给出结论
事件传递Activity-ViewGroup-view,明白 图1 的意思。
事件传递的最小单位是view的onTouchEvent,从onTouchEvent开始开始冒泡(如果布局有嵌套会递归弹栈)依次回传ViewGroup的onTouchEvent(如果onTouchEvent()没有返回true)
View 如果不是clickable ,longClickable,contextClickable (可点击状态),不会消费事件
如果给View设置了TouchListener也能处理后续事件,在ACTION_DWON 时返回 true
ViewGroup也是继承于View,ViewGorup本身clickable=false
给View设置clickListener 同时会让 clickable = true
如果View 没有消费ACTION_DOWN 事件,之后其他的ACTION_MOVE,ACTION_UP等事件也不会被响应,(包括上层的ViewGroup),ViewGroup 继承于View,所以ViewGroup也同理
Paste_Image.png
先说ViewGroup层的事件分发源码,去除了很多我认为没有的代码,
@Overridepublic
boolean dispatchTouchEvent(MotionEvent ev) {
boolean handled =
if (onFilterTouchEventForSecurity(ev)) {
//安全检查机制,是否被遮盖
final int action = ev.getAction();
final int actionMasked = action & MotionEvent.ACTION_MASK;
// Handle an initial down.
if (actionMasked == MotionEvent.ACTION_DOWN) { //如果是按下事件,需要重置事件
// Throw away all previous state when starting a new touch gesture.
// The framework may have dropped the up or cancel event for the previous gesture
// due to an app switch, ANR, or some other state change.
mFirstTouchTarget =
// Check for interception.
if (actionMasked == MotionEvent.ACTION_DOWN
|| mFirstTouchTarget != null) {
//这里调用调用拦截事件
intercepted = onInterceptTouchEvent(ev);
// There are no touch targets and this action is not an initial down
// so this view group continues to intercept touches.
intercepted =
// Check for cancelation.
final boolean canceled = resetCancelNextUpFlag(this)
|| actionMasked == MotionEvent.ACTION_CANCEL;
if (!canceled && !intercepted) {
if (actionMasked == MotionEvent.ACTION_DOWN
|| (split && actionMasked == MotionEvent.ACTION_POINTER_DOWN)
|| actionMasked == MotionEvent.ACTION_HOVER_MOVE) {
dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)
//这里主要调用这个方法
// Dispatch to touch targets.
if (mFirstTouchTarget == null) {
// No touch targets so treat this as an ordinary view.
handled = dispatchTransformedTouchEvent(ev, canceled, null, TouchTarget.ALL_POINTER_IDS);
// Dispatch to touch targets, excluding the new touch target if we already
// dispatched to it.
Cancel touch targets if necessary.
// Update list of touch targets for pointer up or cancel, if needed.
首先(ACTION_DOWN,ACTION_MOVE,ACTION_MOVE)这一系列事件可以合并为一个流程,并且会和一个对象进行绑定,这个对象是mFirstTouchTarget,这个很重要,当用户按下时,会生成一个新的点击对象,并对老的对象会接受到cancel事件。
if (actionMasked == MotionEvent.ACTION_DOWN) { //如果是按下事件,需要重置事件
// Throw away all previous state when starting a new touch gesture.
// The framework may have dropped the up or cancel event for the previous gesture
// due to an app switch, ANR, or some other state change.
mFirstTouchTarget =
这里开始调用onInterceptTouchEvent,这里注意如果是按下事件,或者mFirstTouchTarget !=null 就会调用onInterceptTouchEvent,刚刚按下事件已经将mFirstTouchTarget置为了空,所以能进如这个条件下的判断。
聪明的你联想下上下文,是不是大致猜测ACTION_DOWN 以后的事件没有被调用是和这个mFirstTouchTarget对象有关呢。
if (actionMasked == MotionEvent.ACTION_DOWN
|| mFirstTouchTarget != null) {
//这里调用调用拦截事件
intercepted = onInterceptTouchEvent(ev);
// There are no touch targets and this action is not an initial down
// so this view group continues to intercept touches.
intercepted =
这行代码的意思是如果是没有取消事件,没有被拦截,并且为按下事件开始分发事件,如果返回true,就把当前点击的View 赋值给mFirstTouchTarget,并设置标识已经分发过一次。
if (!canceled && !intercepted) {
if (actionMasked == MotionEvent.ACTION_DOWN
|| (split && actionMasked == MotionEvent.ACTION_POINTER_DOWN)
|| actionMasked == MotionEvent.ACTION_HOVER_MOVE) {
if(dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)
alreadyDispatchedToNewTouchTarget =
//遍历childView 并把点击view赋值给mFirstTouchTarget
if (mFirstTouchTarget == null) {
// No touch targets so treat this as an ordinary view.
//如果没有响应的View 则把事件传递给本身
handled = dispatchTransformedTouchEvent(ev, canceled, null, TouchTarget.ALL_POINTER_IDS);
// Dispatch to touch targets, excluding the new touch target if we already
// dispatched to it.
Cancel touch targets if necessary.
if(alreadyDispatchedToNewTouchTarget && target == newTouchTarget){
handled = true;
// Update list of touch targets for pointer up or cancel, if needed.
如果mFirstTouchTarget = null.就不会再传递事件,这时可以在 android studio 可以调试下,直接断点放到mFirstTouchTarget == null 里面,看看是不是跑这里来了,虽然我们只是在界面上放了几个view,但是却会顶层嵌套好几层其他view,AppBarLayout等。
看到这里好像还是不大明白,先看下dispatchTransformedTouchEvent这个分发方法到底做了什么
if (child == null) {
handled = super.dispatchTouchEvent(event);
handled = child.dispatchTouchEvent(event);
我们的child是几个TextView ,继承View,接着看看super.dispatchTouchEvent
public boolean dispatchTouchEvent(MotionEvent event) {
if (onFilterTouchEventForSecurity(event)) {
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerI
if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
if (onTouchEvent(event)) {
这里代码只有几句很简单,如果你设置了onTouchListener,就会先调用mOnTouchListener.onTouch,如果onTouch事件返回true的话,事件将不会往下传递,再记忆下前面的只有在ACTION_DOWN的时候才设置mFirstTouchTarget的值,&b&否则事件不会再往下传递否则onTouch事件也只会调用一次ACTION_DOWN&/b&,这里是不是可以作为突破口呢?
接着进入view的onTouchEvent
public boolean onTouchEvent(MotionEvent event) {
if (((viewFlags & CLICKABLE) == CLICKABLE ||(viewFlags & LONG_CLICKABLE) ==LONG_CLICKABLE)(viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE) {
//这里直接返回true
//否则返回false
这里也简单,如果View是可点击直接返回true,否则返回false,调用viewGroup的supler(View).dispatchEvent(),
看到这里,你想到几种方案解决上面的问题了呢?
要不现在动手试试?
个人水平有限,如果错误,请指正,大家一起学习进步。
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
Android 事件分发和滑动冲突都是开发中经常遇到的难点问题,遇到问题时可能会通过 Google 或者 StackOverflow 按照别人的经验解决了问题,但每次遇到这种问题都去 Google 也是非常不合适的事情。本篇文章将从 Android 事件分发的源码入手,首先...
Android分发机制概述: Android如此受欢迎,就在于其优秀的交互性,这其中,Android优秀的事件分发机制功不可没。那么,作为一个优秀的程序员,要想做一个具有良好交互性的应用,必须透彻理解Android的事件分发机制。 要想充分理解android的分发...
上月回娘家,过完年计划好的,一切都按计划进行。 孩子爸工作忙,不去;收拾行李,买票全都交给我来做。 我在买票时,第一时间就想到怎么能在最短的时间到达,所以我选择了动车。 赣州没有直达重庆的动车,我选择先坐到南昌再坐动车到重庆。 票在上月3号就买好,买的13号的票! 第二天我...
本期编辑:小门门 评文官:爱佛僧、絲綢 爱与恨,仍在心里;情与梦,却已远离。纵然记忆于心,抹不去;无奈忧愁固己,掩轻语。何愁漫漫前路无知己?梦中有你足矣! 自琅琊令颁布以来,江湖儿女踊跃参与,欲入琅琊阁夺琅琊榜榜首之位。 经一周角逐,截止8月21日中午12时,第二十一期琅琊...
她决定到河边去走走,这是她卧床休病以来第一次出门。 已是深秋,秋天的天空总是那样锋利的高远,风吹得树叶沙沙作响,她不由得裹紧身上的风衣,平底鞋不时的被小石头硌住,她家离河堤边不远。刚走了几步,她感到左脚后跟疼,用手摸了一下,有一个小肿块,紧接着右脚脚踝也有点疼,这身体就像机...
每日必读:7条人生守则(采用对标的方法) 1.早睡早起--晚11早5:30
是学习成长的根基保障,午休5-15min. 2.真诚反思--&我“是一切的根源,真诚地解剖自己言行有无疏漏 3.学习成长--每天进步一点点,反思-计划-行动,以慢为快,站在终点看起点。 4.养成好...
图片发自简书App 相由心生 身心健康者,容颜自有华。心健身弱者,儒雅生光辉。身強心暗者,荣华逝眼角,身心俱废者,槁木且死灰。青春年少者,天地聚精气,垂垂老朽者,多有童子色,此间有深意,一望便有知。诗曰,心灵如刀斧,昼夜细雕琢,经年累月后,境界自分说!当前位置:
&求大神解答这个问题UDF编译问题
求大神解答这个问题UDF编译问题
作者 super雪儿
请问&&Ansys 18.2 和VS2010&&载入UDF出现这个问题怎么办啊?求大神解答&&已经困了好几天了
The UDF library you are trying to load (libudf-silo) is not compiled for parallel use on the current platform (win64)
引用回帖:: Originally posted by gyctju at
重新编译 不好意思&&我对VS可能还是不太懂&&这是什么意思啊?是重新写程序吗?
我以前遇到过& &貌似是环境变量的问题& & 最后没有解决
引用回帖:: Originally posted by 陈时通 at
我以前遇到过& &貌似是环境变量的问题& & 最后没有解决 那最后怎么办了啊?重新装系统吗,
24小时热帖
下载小木虫APP
与700万科研达人随时交流→ 很想知道,希望医生为我解答这个问题
很想知道,希望医生为我解答这个问题
健康咨询描述:
之前有个按时间来算钱的心理讲师来像大家讲40分钟心理,他说,根据向他询问的很多案例,和家人不够亲近的人,大多数之后婚姻都会出现问题,他说这类人一般不轻易相信别人,一旦相信了就会过度依赖。我想说,我之前也看过类似心理文章,但是我觉得这个讲师说的有问题。且不说现在正常家庭孩子父母之前存在代沟问题,而且,有的父母从小就采取一种放养独立的教育方式。(这里放养不是不闻不问,只是对孩子不过多干涉,不过度保护,但是不忽略思想上是非对错的教育)孩子有独立思想,和自己见解,和父母不是和亲近的,难道以后婚姻会出现问题?再说,如果一直都是黏着父母,永远离不开家,父母,难道才是好的?我想请教一下,是我的想法有错误吗,还是讲师表达有误呢,我也有看过一些关于心理的书,看过,一般单亲家庭,婚变后的家庭里,孩子才会出现对婚姻另一半过赖的情况,对吗
其他类似问题
医生回复区
龙口市人民医院&& 副主任医师
擅长: 原发性高血压,型糖尿病,二型糖尿病,冠心病,肺气肿
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&任何一种说法都是有它有利的一方也有它错误的一面,每个人的情况是不一样的。&&&&&&指导意见:&&&&&&任何事情都不是绝对的,只要保证良好的心理状态,找到自己的幸福价值观就可以
固始县精神病医院&& 国家二级心理咨询师
擅长: 诊断与治疗临床各科常见疾病,对性,婚恋,家庭,亲子
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&你好,这是一个见仁见智的问题,孩子的成长,是内因和外因共同作用的结果。&&&&&&指导意见:&&&&&&积极面对,保持乐观,善待自己,宽容别人,与人为善,积极地适应环境,相信自己,祝你健康幸福。
聊城市人民医院&& 医师
擅长: 擅长治疗甲状腺瘤,甲状腺癌,甲状腺功能减退症,单纯
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&您好,根据您的描述和症状,考虑还是家庭的原因带来的,希望你不要受影响。&&&&&&指导意见:&&&&&&个人建议平时还是要规律生活,作息规律,放轻松,学会倾诉和加强锻炼,慢慢就会好的。不要总是管家里的事儿,做好自己就好。&&&&&&以上是对“很想知道,希望医生为我解答这个问题”这个问题的建议,希望对您有帮助,祝您健康!
长治市中医研究所附属医院&& 主治医师
擅长: 高血压病,眩晕病,头痛,面瘫,脑更塞,脑出血,蛛网
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&你好,每个人的成长,受家庭的影响都非常大。但是,并不是说每一个人都一样,单亲家庭的人,并不是说都会结婚以后发生婚变,这种概率还是小的,不用担心。&&&&&&指导意见:&&&&&&建议。生活和环境有多种多样,要自己有多样性的适应能力。能够应对各种生活变化,就不会担心,以后会发生,结婚在离婚的情况,要对自己有信心。能够妥善处理好生活中的各种关系,就不用担心离婚
您可能关注的问题
用药指导/吃什么药好
本品用于湿热瘀滞所致的带下病。...
参考价格:¥28
本品用于跌打损伤,跖骨、趾骨骨折,瘀血肿痛,吐血...
参考价格:¥17.5
您好,虽然我们的工作人员都在竭尽所能的改善网站,让大家能够非常方便的使用网站,但是其中难免有所疏漏,对您造成非常不必要的麻烦。在此,有问必答网向您表示深深的歉意,如果您遇到的麻烦还没有解决,您可以通过以下方式联系我们,我们会优先特殊解决您的问题。
请选择投诉理由
涉嫌广告宣传
无意义提问
非医学类咨询
违背伦理道德
其他投诉理由
涉嫌广告宣传
无意义回复
违背伦理道德
复制粘贴内容
常识性错误
其他投诉理由
如遇紧急情况,请致电400-000,000,000&人次学习了新知识登录一下,而成为分享知识的一员等你答精彩企业问答[中公教育]&&[天极科普问答]&&分类精华知识问答新鲜事 助人光荣榜体育运动本周回答 : 276&&&&本周采纳 : 81本周回答 : 27&&&&本周采纳 : 8活力乐帮团以团队之力,帮助更多人推荐/采纳 : 34擅长 : 宠物,科学,教育推荐/采纳 : 23擅长 : 眼科,医疗健康推荐/采纳 : 13擅长 : 烦恼,教育,家庭推荐/采纳 : 5擅长 : 玩具,体育,运动推荐/采纳 : 66擅长 : 硬件,电脑,软件
恭喜完成日常任务“天天助人1” 10金币奖励已发放
啊哦,你还是无名氏
登录做任务,奖励多多,还可抽手机哦~}

我要回帖

更多关于 大家先把这个问题考虑 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信