android的事件机制

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程

一、触摸事件

事件机制好比生活中的例子

你是一个公司的员工,你的上头有一个主管,主管上头呢还有一个经理。为了简单,你们这个团队就有这三个人。那么如果上头安排一件事下来要处理,流程是怎样的呢?
显然应该是由你的经理将这件事安排给你的主管来处理,你的主管再将这件事安排给你来处理。等你把这件事办好了,你就应该给你的主管报告,再由你的主管来向你的经理
报告。显然,你的主管和经理也有处理这件事的权限,如果他们觉得事情很复杂,你办不了,或者他们比较照顾下级,可能就自己把这件事给办了,这个时候这件事就不会再
传递给下一级来处理了。这个事件处理的过程,是不是太容易理解了!

要深入理解android中的事件机制,需要从如下两个方面:事件传递和处理机制

引用https://www.cnblogs.com/fuly550871915/p/4983682.html 的例子

ViewGroupA中嵌套了一个VewiGroupB,然后又在ViewGroupB中嵌套了一个MyView。那么一个触摸事件传递过来,会发生什么情况呢?

触摸事件传递过来后,ViewGroupA一看自己里面还有一个员工可以利用,就是ViewGroupB,那不用白不用,就会把这个事件传递给ViewGroupB,告诉他,你给我把这个事件处理了!
ViewGroupB呢一看,我不怕,我里面也有一个员工就是MyView,它得给我干活,于是又会把这个事件传递给MyView,让它来处理。MyView一看,没办法啊,我手底下没有员工了,那
怎么办,我只能自己处理了(前提是它有处理这个事件的能力),所以就把这个触摸事件给处理了。处理完成后呢?MyView就是给ViewGroupB报告,我已经把事情办好了,你来审核一下
,看看办理的咋样。ViewGroupB一审核,觉得不错,就再将结果呈现给ViewGroupA。ViewGroupA再审核,通过了才算通过。在这个过程中,也可能出现几种情况:
(1)MyView说,完蛋了,这事我的能力办不好啊,于是就向VeiwGroupB报告,我没有处理,请你来处理,你是我上司,能力比我强。于是ViewGroupB就会来帮忙处理。当然了,
如果ViewGroupB也没能力处理,那就只能反馈给VeiwGroupA,让它来消化这个事件。
(2)也可能MyView处理非常完美,向ViewGroupB一报告,ViewGroupB一开心就说不用再交给ViewGroupA审核了,我担保通过,于是事件到此直接终止。

用一个专业的术语来说,父View管理子View,从上往下传递,谁消费了就终止了。

在ViewGroup中,有如下三个方法
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
在View中,有如下两个方法
dispatchTouchEvent
onTouchEvent

对于事件的拦截,我们主要重写就是OnInterceptTouchEvent和onTouchEvent方法。两句就可以总结:
(1)对于事件的传递,返回结果为true,表示拦截,不再往下传递,为false,不拦截,继续往下传递。主要针对的就是OnInterceptTouchEvent方法。
(2)对于事件的处理,返回结果为true,表示拦截,不再往上传递(即我处理的很完美,不需要你再来审核我!),返回结果为false(没有成功处理事件),继续向上传递。
针对就是onTouchEvent方法。

二、点击事件

涉及到的API有
dispatchKeyEvent
onKeyDown
onKeyUp
onKeyLongPress

针对onKeyUp,如果按住的是返回键,return true则不退出界面。

事件经过的一系列有down–>down–>down–>… ->up
up只调用一次。
对于长按事件,需要设置onKeyDown的返回值为true,并开启追踪

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
    
    
		Log.e("TAG", "onKeyDown() action="+event.getAction()+" code="+event.getKeyCode());
		event.startTracking();//追踪事件, 用于长按监听
		return true;
	}

猜你喜欢

转载自blog.csdn.net/huangbaokang/article/details/112258678
今日推荐