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

网站开发关键技术linux主网站设计

网站开发关键技术,linux主网站设计,亿联网络 网站,中山市做网站的公司android 中的事件处理一直以来困扰不少刚刚从事 android 开发的同学#xff0c;网上也有不少讲解 android 事件分发的文章#xff0c;然而讲解的都不够简洁#xff01;现在我将用另一种简洁的方式来讲解 android 事件的分发机制#xff01;android 的事件分发可以简单的归位…android 中的事件处理一直以来困扰不少刚刚从事 android 开发的同学网上也有不少讲解 android 事件分发的文章然而讲解的都不够简洁现在我将用另一种简洁的方式来讲解 android 事件的分发机制android 的事件分发可以简单的归位两类1.view 的事件分发和处理 2.ViewGroup 的事件分发和处理。我们首先分析 View 的事件分发和处理。View 的事件分发和处理View 中的事件分发和处理涉及到了两个方法1.public boolean dispatchTouchEvent(MotionEvent event) 2.public boolean onTouchEvent(MotionEvent event) 它们的返回值都为 boolean 类型。在 View 中 dispatchTouchEvent(MotionEvent event) 负责将事件分发给 onTouchEvent(MotionEvent event)来处理简单一点理解就是下面的这段代码Overridepublic boolean dispatchTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewdispatchTouchEvent event.getAction());boolean handed onTouchEvent(event);return handed}Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewonTouchEvent event.getAction());return true;}通过简易模型我们可以看到在 dispatchTouchEvent(MotionEvent event)只要返回 true 就代表这个 View 消耗了这个事件。如果在 onTouchEvent(MotionEvent event)中返回 true那么这个事件的传递链就是这样的activity 的 dispatchTouchEvent()——ViewGroup 的 dispatchTouchEvent()——ViewGroup onInterceptTouchEvent()——view 的 dispatchTouchEvent()—— view 的 onTouchEvent()如果在 dispatchTouchEvent(MotionEvent event)中直接返回 true。类似于这样public boolean dispatchTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewdispatchTouchEvent event.getAction());return true;}那么这个事件依旧是被这个 View 消耗了是被 dispatchTouchEvent()消耗的并没有将事件分发给 onTouchEvent()所以这个 View 的 onTouchEvent()不会执行这是这个事件的传递链是这样的activity 的 dispatchTouchEvent()——ViewGroup 的 dispatchTouchEvent()——ViewGroup onInterceptTouchEvent(——view 的 dispatchTouchEvent()。在 dispatchTouchEvent(MotionEvent event)只要返回 false 就代表这个 View 不消耗这个事件。如果在 onTouchEvent(MotionEvent event)中返回 false除了 action_down 以外后续事件都不会传递到这个 View 上当然如果直接在 dispatchTouchEvent(MotionEvent event)中直接返回 false这个 View 的 onTouchEvent()不会执行。原理同直接返回 true然而在现实中经常会看见这样的写法Overridepublic boolean dispatchTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewdispatchTouchEvent event.getAction());return super.dispatchTouchEvent(event);}Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewonTouchEvent event.getAction());return super.onTouchEvent(event);}它们调用 super 的方法是因为在父类中它们各自定义了一些事件分发或者事件处理逻辑。特别是在 super.dispatchTouchEvent 中定义了将事件交给onTouchEvent()处理的逻辑。ViewGroup 的事件分发和处理ViewGroup 中的事件分发出处理涉及到了三个方法1.public boolean dispatchTouchEvent(MotionEvent event) 2.public boolean onInterceptTouchEvent(MotionEvent ev) 3.public boolean onTouchEvent(MotionEvent event) 它们的返回值都是 boolean 类型。在 ViewGroup 中 dispatchTouchEvent(MotionEvent event) 负责先将事件分发给自己 onInterceptTouchEvent(MotionEvent ev)来判断自己是否拦截事件如果 onInterceptTouchEvent(MotionEvent ev) 返回 true表示自己要拦截这个事件那么这个事件就会交给自己的onTouchEvent(MotionEvent event)处理如果事件被自己的 onTouchEvent()消耗那么后续事件将直接交给自己的 onTouchEvent()处理如果事件不消耗那么 ViewGroup 的父控件不会再将事件分发过来。如果不拦截事件那么 ViewGroup 就会将事件分发给子 View如果子 View 也不处理这个事件那么它就会将事件交给自己的 onTouchEvent(MotionEvent event)来处理。简单一点理解就是下面的这段代码Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {Log.i(eventTest, EventViewGroupdispatchTouchEvent ev.getAction());if (!inter) {inter onInterceptTouchEvent(ev);}if (inter) {handed onTouchEvent(ev);} else {childHanded getChildAt(0).dispatchTouchEvent(ev);if (!childHanded) {handed onTouchEvent(ev);}}return handed || childHanded;}Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {Log.i(eventTest, EventViewGrouponInterceptTouchEvent ev.getAction());return false;}Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewGrouponTouchEvent event.getAction());return false;}通过简易模型我们可以看到ViewGroup 的 onInterceptTouchEvent()则是用来直接拦截事件的如果返回 true就代表本 ViewGroup 要拦截事件并将事件交给自己的 onTouchEvent 处理。事件一旦被拦截 就不会再分发给当前 ViewGroup 包含的子控件了。ViewGroup 的 dispatchTouchEvent()返回 true 就代表了这个事件是被这个 ViewGroup 消耗了。而在这个 ViewGroup 中我们知道是 ViewGroup 本身消耗了事件还是它包含的子 view 消耗了事件从而决定了事件是分发给自己还是包含的子 view。通过对 ViewGroup 的事件分发模型的简单化我们可以可以看出来如果 ViewGroup 的 dispatchTouchEvent(MotionEvent ev)直接返回 truepublic boolean dispatchTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewdispatchTouchEvent event.getAction());return true;}那么这个事件就会被当前的 ViewGroup 直接消耗。既不会交给自己的 onInterceptTouchEvent()以及 onTouchEvent()也不会分发给子 view。但是如果直接返回 false当前 viewGroup 既不会消耗事件也不会对事件做任何分发但是当前 ViewGroup 会接收到 action_down 事件。然而在现实中经常会看见这样的写法Overridepublic boolean dispatchTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewdispatchTouchEvent event.getAction());return super.dispatchTouchEvent(event);}Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {Log.i(eventTest, EventViewGrouponInterceptTouchEvent ev.getAction());return super.dispatchTouchEvent(ev);}Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i(eventTest, EventViewonTouchEvent event.getAction());return super.onTouchEvent(event);}这是因为父 View 中对这几个方法都有一些默认的处理逻辑。activity 的事件分发和处理activity 的事件分发模型和 ViewGrooup 类似只是没有 onInterceptTouchEvent(MotionEvent ev)这一步。可以简单概括为Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {Log.i(eventTest, MainActivitydispatchTouchEvent ev.getAction());viewHanded getWindow().getDecorView().findViewById(android.R.id.content).dispatchTouchEvent(ev);if (!viewHanded){handed onTouchEvent(ev);}return handed || viewHanded;}Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i(eventTest, MainActivityonTouchEvent event.getAction());return super.onTouchEvent(event);}activity 的事件先传递给它包含的布局来处理如果布局不处理才会交给自己的 onTouchEvent()处理。总结为什么在不拦截不处理事件的情况下事件的分的过程是有 acttivity.dispatchTouchEvent(MotionEvent ev) viewGroup.dispatchTouchEvent(MotionEvent ev) onInterceptTouchEvent(MotionEvent ev) view.dispatchTouchEvent(MotionEvent ev) view.onTouchevent(otionEvent ev)viewGroup.onTouchevent(otionEvent ev) activity.onTouchevent(otionEvent ev)从对 View 和 viewGroup 以及 activity 中的事件分析我们可以看到事件的分发处理过程是这样的首先由 activity 优先分发给他的根视图而根视图会优先判断是否拦截事件不拦截则对事件做继续分发直到在某一级视图事件被消耗了才会停止分发这个事件否则在最后一层视图因为它没有子视图了那么事件的分发就结束了从而转入对 onTouchevent()的调用当 onTouchevent()执行结束它的 dispatchTouchEvent(ev)执行结束即它的父视图的 getChildAt(0).dispatchTouchEvent(ev)执行结束然后它的父视图就会判断是否调用自己的 onTouchevent()...依次类推就有了上面的事件分发处理链。
http://www.sadfv.cn/news/327597/

相关文章:

  • 设计网站广告语海口住房与城乡建设官网
  • 营销型网站建设广告语世界足球排名前100
  • 做电影网站程序好用百度站长链接提交平台
  • 做彩票网站被北京微信小程序开发
  • 12380网站开发网站建设实训步骤
  • 温州编程网站电子商务企业网站的建设
  • 网站开发产品需求说明深圳最大的企业排名
  • vr网站制作网址导航大全排名
  • 无锡市建设招标网站慈利网站开发
  • 网站建设合同 模板 下载flash网站开发框架
  • 网站开发研究背景北京建展科技发展有限公司
  • 做网站网页二手车网站html模板
  • 网站诊断内容行业关键词分类
  • 广西智能网站建设制作郑州企业健康码二维码怎么申请
  • 营销网站制作平台有哪些新品发布会现场
  • 深圳制作网站哪家好福州有什么做网站的公司
  • 爱站工具网邢台规划局网站建设
  • 皋兰网站建设平台网页维护
  • 虚拟机怎么做网站小城镇建设的网站
  • 建教会网站的内容网站管理员权限
  • 高性能网站建设指南pdfwordpress oa系统
  • 做网站用哪些语言服装商城的网站策划书
  • 网站营销策略哈尔滨seo优化专注
  • 无锡 网站 seo 优化无极网址
  • 高职院校高水平专业建设网站山东省建设项目监理协会网站
  • 搜索引擎网站排行榜积分商城系统
  • 北京个人制作网站免费网站开发模板
  • 河北 网站建设登陆网站空间
  • 百度怎么注册自己的网站江苏省通信建设交易中心网站
  • 长沙做彩票网站公司wordpress 加速会