时间:2015-04-09 来源:

从源码角度带你分析AndroidView事件分发dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程(一) 【编程语言】

关于Android View 事件分发过程的文章网络上可以搜到一把大网页外包接活,这里贴一篇代码性的文章,网页外包接活作者也是个牛人:Android事件分发机制完全解析,网页切图价格 0); } // Clean up after nested scrolls if this is the end of a gesture; // also cancel it if we tried an ACTION_DOWN but we didn't want the rest // of the gesture. if (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_CANCEL || (actionMasked == MotionEvent.ACTION_DOWN && !result)) { stopNestedScroll(); } return result; } 从第17行可以看出,html静态页面制作条件成立,web切图报价result=true;那么第23行if条件根本不会执行第二个判断,psd转html那么就不会执行onTouchEvent方法,html切图制作也就不会调用 onClick的接口网页外包接活,因此Button 不会执行setOnClickListener中的onClick事件.

布局文件如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <com.xjp.testtouchevent.MyButton android:id="@+id/myButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试" /> </RelativeLayout> 测试Activity如下:

我们先从一个例子看起,网页外包接活先重写一个MyButton 继承Button, x, so remove the longpress check removeLongPressCallback(); // Only perform take click actions if we were in the pressed state if (!focusTaken) { // Use a Runnable and post this rather than calling // performClick directly. This lets other visual state // of the view update before click actions start. if (mPerformClick == null) { mPerformClick = new PerformClick(); } if (!post(mPerformClick)) { performClick(); } } } if (mUnsetPressedState == null) { mUnsetPressedState = new UnsetPressedState(); } if (prepressed) { postDelayed(mUnsetPressedState, unpress right now mUnsetPressedState.run(); } removeTapCallback(); } break; return true; } return false; } 我们看看这里边都做了些什么符合w3c标准,忽略其他,符合w3c标准我们直接看37行的  performClick(); 方法网页外包接活,跳进去继续看,jpg或psd转html(注意:这里的performClick方法是在ACTION_UP手势里边执行的哦!!!)

      现在我们来看看其他情况:当onTouch返回为true,打印结果如下:

我们从打印结果可以直观看到,web前端制作点击Button按钮事件分发过程如下 dispatchTouchEvent---->onTouch---->onTouchEvent----->onClick.并且如果仔细的你会发现承接网页制作,都是在ACTION_UP事件之后才触发onClick点击事件,兼职手机网页制作为什么会是这样??现在我们不得而知.我们仅仅是从打印结果推测事件分发的结论web切图报价,现在我们从源码分析下这个事件分发流程为什么是这样子.

事件分发都是从dispatchTouchEvent方法开始的,网站div+css那么我们这里是重写了dispatchTouchEvent方法符合w3c标准,并且最后也调用了父类的super.dispatchTouchEvent(event)方法.那么我们看看父类中的方法到底做了什么??点击进入父类的dispatchTouchEvent方法,符合w3c标准发现此方法在View类中找到网页外包接活,其实也不奇怪,网页外包接活所有控件的父类都是View.这里我贴出最新源码如下:

public boolean performClick() { final boolean result; final ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); li.mOnClickListener.onClick(this); result = true; } else { result = false; } sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); return result; }看见没??第6行 li.mOnClickListener.onClick(this);  这个接口回调就是我们Button的 onClick事件.到此为止web前端制作,我们从源码分析了Button事件分发过程  结论:dispatchTouchEvent---->onTouch---->onTouchEvent----->onClick.并且如果仔细的你会发现,div+css制作是在所有ACTION_UP事件之后才触发onClick点击事件.

忽略其他无关代码承接网页制作, event) 的返回值,在MainActivity代码里符合w3c标准,所以在源码中我们可以看到 17行的条件不成立网页外包接活,那么条件不成立,网页外包接活result=false;因此web前端制作,源码的第23行if 判断第一个条件成立,web前端制作继续执行第二个条件承接网页制作,也就是onTouchEvent.我们跳到这个方法里看看里面干啥了?看如下代码:

给个简单的流程图如下

惊奇的发现,div前端切图竟然没有执行onClick事件是吧????如果你仔细阅读上面的文章web切图报价,估计你知道为什么了吧?还是跟大家一起分析一下吧:源码如下:

因此,web切图报价事件分发之间的关系是:dispatchTouchEvent方法中线执行 onTouch接口回调符合w3c标准,然后根据onTouch方法的返回值判断是否执行onTouchEvent方法,符合w3c标准onTouchEvent方法中执行了onClick接口回调.

public class MyButton extends Button { public MyButton(Context context) { super(context); } public MyButton(Context context, attrs); } public MyButton(Context context, int defStyleAttr) { super(context, defStyleAttr); } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: MyLog.e("dispatchTouchEvent====MyButton=====ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: MyLog.e("dispatchTouchEvent====MyButton=====ACTION_MOVE"); break; case MotionEvent.ACTION_UP: MyLog.e("dispatchTouchEvent====MyButton=====ACTION_UP"); break; } return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: MyLog.e("onTouchEvent====MyButton=====ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: MyLog.e("onTouchEvent====MyButton=====ACTION_MOVE"); break; case MotionEvent.ACTION_UP: MyLog.e("onTouchEvent====MyButton=====ACTION_UP"); break; } return super.onTouchEvent(event); }

public class MainActivity extends ActionBarActivity { private Button myButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myButton = (Button) findViewById(R.id.myButton); myButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: MyLog.e("onTouch====MyButton=====ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: MyLog.e("onTouch====MyButton=====ACTION_MOVE"); break; case MotionEvent.ACTION_UP: MyLog.e("onTouch====MyButton=====ACTION_UP"); break; } return false; } }); myButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MyLog.e("onClick====MyButton=====onClick"); } }); } } 点击测试按钮,网站div+css打印结果如下:

虽然讲的很好符合w3c标准,但是看完之后还是感觉有那么点一知半解,符合w3c标准于是自己花了点时间从源码研究android 触摸事件分发流程网页外包接活,以下内容仅仅个人理解,网页外包接活如有差错希望指出.

public boolean dispatchTouchEvent(MotionEvent event) { boolean result = false; if (mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onTouchEvent(event, event)) { result = true; } if (!result && onTouchEvent(event)) { result = true; } } if (!result && mInputEventConsistencyVerifier != null) { mInputEventConsistencyVerifier.onUnhandledEvent(event, 0); } // Clean up after nested scrolls if this is the end of a gesture; // also cancel it if we tried an ACTION_DOWN but we didn't want the rest // of the gesture. if (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_CANCEL || (actionMasked == MotionEvent.ACTION_DOWN && !result)) { stopNestedScroll(); } return result; }

点击次数:12022
作者:
web前端行业资讯
Web new NewsList
英特尔宣布与法拉利跨界合作欲将AI技术用于赛车运动 ,,2018年01月11日甲骨文服务器出漏洞:攻击者用漏洞挖矿获取加密货币 ,,2018年01月11日用深度学习设计图像视频压缩算法:更简洁、更强大 ,,2018年01月11日Ubuntu内核和NVIDIA更新:修复Meltdown和Spectre两处漏洞 ,,2018年01月11日AntDesign3.1.1发布,阿里企业级UI设计语言 ,,2018年01月11日微信「跳一跳」带火小游戏,开发者如何快速上手? ,,2018年01月11日谷歌公布最新安卓系统份额:你用上奥利奥了么? ,,2018年01月11日腾讯开发出“3D音效”算法:普通耳机实现3D实时语音效果 ,,2018年01月11日谷歌工程师点赞中国程序员实现Node.js启动超4倍提速 ,,2018年01月11日三星电子总裁兼CE部门负责人金炫奭:万物互联时代到来 ,,2018年01月11日NVIDIA和大众合作建立智能驾驶助手 ,,2018年01月11日GIMPS项目报告发现已知最大素数 ,,2018年01月11日微软与生物技术公司开展AI驱动的血液检测同时诊断数十种疾病 ,,2018年01月11日微软跨平台移动开发工具套件HockeyApp宣布免费 ,,2018年01月11日《硅谷》里神乎其神的压缩技术,AI正在一点点做出来 ,,2018年01月11日LinuxMint19代号敲定为“Tara”预计2018年5月至6月期间发布 ,,2018年01月11日Facebook发布wav2letter工具包,用于端到端自动语音识别 ,,2018年01月11日开源数据库ArangoDB正进行约1156万美元股权融资 ,,2018年01月11日IntelCPU漏洞闹大:腾讯云紧急升级 ,,2018年01月11日2018年1月全球数据库排名:Redis夺回第八 ,,2018年01月11日Lyft将联手无人驾驶公司于CES上展示无人驾驶汽车 ,,2018年01月11日京东X无人超市首家社会门店开业:刷脸进、微信自动结算 ,,2018年01月11日担心被AI取代是杞人忧天?高晓松跨年演讲说的有几分对 ,,2018年01月11日免费授权技术许可Intel宣布在未来CPU中集成雷电3 ,,2018年01月11日算法决定你在社交媒体上看到的信息 ,,2018年01月11日谷歌安全博客披露“英特尔内核漏洞”更多细节 ,,2018年01月04日Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日【整合篇】JBPM4.4业务与流程的整合【综合】2015年01月24日hdu1398SquareCoins(母函数)【移动开发】2015年07月17日基于JavaTomcat和激活MyEclips的深入理解2014年01月30日【数据结构-队列】链式队列 【Web前端】2015年05月11日【java的继承extends】 【编程语言】2015年05月25日asp.net--ListView中ItemTemplate设置与功能按钮 【编程语言】2014年12月10日Android特效开发(仿zaker用手向上推动的效果(推动门效果))【编程语言】2015年01月19日ExtJS自定义主题(theme)样式详解2014年01月29日vs连接mysql出错解决方法 【云计算】2015年07月06日数据结构在Java中的用法(持续更新...) 【综合】2015年05月15日如何随时随地退出Activity,在退出Activity的时候关闭之前的Activity,如何退出程序所有Activity 【编程语言】2015年04月08日预测:未来手机游戏开发者如何赚钱?(信息图) ,,2016年06月23日最简单的基于DirectShow的示例:视频播放器图形界面版 【编程语言】2015年01月12日nodejs的进程process 【移动开发】2015年05月05日iOS:shareSDK第三方登录(qq微信) 【编程语言】2015年03月09日java设计模式(9):模板方法模式(TemplateMethod) 【互联网】2014年11月18日POJ2481Cows简单树状数组区间覆盖2015年01月07日设计模式_模板方法模式 【编程语言】2015年07月20日AndroidWebViewjs与java之间相互通信【移动开发】2014年12月16日POJ_1986_DistanceQueries(LCA+tarjan) 【编程语言】2015年08月05日mongodb学习(查询详解) 【编程语言】2015年05月25日smarty模板嵌套之include与fetch性能测试2014年01月29日leetCode(48):ExcelSheetColumnNumberAndExcelSheetColumnTitle【综合】2015年07月27日基于OAuth安全协议的Java应用编程1 【移动开发】2015年07月16日GalaxyNexus能否替换掉你手中的iPhone? ,,2016年07月24日PIL(Python图像处理库)1.1.7发布 ,,2016年07月24日java基础入门-不用main方法,也可以打印helloworld 【编程语言】2015年05月06日Java核心技术之深入理解对象的生命周期【云计算】2015年09月06日JavaScript数组运用实现代码2014年01月29日top命令 【编程语言】2015年04月24日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)