android事件机制
来源:互联网 发布:网络数据流量检测工具 编辑:程序博客网 时间:2024/06/03 12:12
在android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,事件说明如下:
onClick(View v)一个普通的点击长按按钮事件
onLongClick(View v)一个普通的点击长按按钮事件
boolean onKeyMultiple(int keyCode,int repeatCount,keyEvent event)多个事件连续发生时,用于按键重复,必需重载@override实现
boolean onKeyDown(int keyCode,KeyEvent event)用于按键进行按下时发生
boolean onKeyUp(int keyCode,KeyEvent event)用于按键进行释放时发生
boolean onKeyLongPress(int keyCode,KeyEvent event)当你长时间按时发生
onTouchEvent(MotionEvent event)触摸屏事件,当你触摸屏幕时发生
boolean dispatchTouchEvent(MotionEvent event)触控时负责事件传递,必需重载@override实现(view和activity都可以进行分发)
boolean onInterceptTouchEvent(MotionEvent event)触控时负责事件拦截
我们先大致了解下android事件机制,安卓事件机制主要包含事件的拦截,传递(分发),响应(消费)。在翻阅了很多文章后,在结合谷歌官方文章总结出,安卓每个事件都会进行以上三个过程。那么接下来我们先开始理解下事件的整个过程。
(1)Event事件的拦截
onInterceptTouchEvent(),安卓中此事件负责拦截一个用户产生的点击或者触摸事件,主要起终止传递作用,当用户点触摸产生一个事件时,由上层(view,activity)传入事件时,此方法负责拦截,拦截后将交由本控件去消费当前事件,如果无需拦截,则继续交由下层的view去自己传递和分发。具体如下:
如果返回ture,则代表拦截此事件,那么事件就不会往子控件进行传递,由当前view进行调用onTouchEvent()来响应该事件,反之返回false不拦截,事件将继续传递,则由子view去调用自己的dispatchTouchEvent()去分发,最后由具体的控件去消费此事件。
注意:很多书中和博客中忽视了一点,当然onInterceptHoverEvent()也拥有拦截权利,但是它和OnInterceptTouchEvent()有细微区别,此方法主要处理滑动事件,通俗讲就是当产生有位移的事件时触发此方法。
(2)Event事件的传递
dispatchEvent(MotionEvent event)负责事件的调度,很多人称之为分发和传递一个意思,其主要负责将事件交由哪个控件去处理,如果自己不想处理,则可以继续往下传递,想处理则触发本身view的ontuchEvent().
此方法也返回boolean类型,返回ture代表传递,返回false代表不传递,和我们的事件拦截恰恰相反,对于初学者来说很容易搞糊涂,本事件Activty,ViewGroup,View都拥有处理权,主要将事件负责转发,无论交由别人处理还是自己,其实都在充当调度角色,是事件的核心。
(3)Event事件响应
安卓中事件具体处理交由onTouchEvent()来执行,此阶段主要负责事件的消费响应,通过处理完事件后,然后逐步向上级汇报,如果消费了上次则不会再进行做响应消费处理,只会继续返回给根布局。
此方法返回布尔类型,如果消费了此事件,则会调用上级的此方法,默认返回false做处理,如果返回true,则代表不消费此事件,让上级调用本方法去做处理,逐步往上汇报,知道activity得到消息为止。
MotionEvent事件
(1)主要的事件类型有:
ACTION_DOWN:表示用户开始触摸.
ACTION_MOVE:表示用户在移动(手指或者其他)
ACTION_UP:表示用户抬起了手指
ACTION_CANCEL:表示手势被取消了
还有一个不常见的:ACTION_OUTSIDE:表示用户触碰超出了正常的ui边界。但是对于多点触控的支持,android加入了以下一些事件类型来处理如:
ACTION_POINTER_DOWN:有一个非主要的手指按下了
ACTION_POINTER_UP:一个非主要的手指抬起来了
(2)事件发生的位置,x,y轴
getx()获得事件发生时,触摸的中间区域在屏幕的x轴。
gety()获得事件发生时,触摸的中间区域在屏幕的y轴。
在多点触控中还可以通过:
getX(intpointerIndex) ,来获得对应手指事件的发生位置.获得Y轴用getY(intpointerIndex)
(3)其他属性
getEdgeFlags():当事件类型是ActionDown时可以通过此方法获得,手指触控开始的边界,如果是的话,有如下几种值:EDGE_LEFT,EDGE_TOP,EDGE_RIGHT,EDGE_BOTTOM
KeyEvent事件
(1)keyevent包括以下类型:
KeyEvent.KEYCODE_DPAD_UP;上
KeyEvent.KEYCODE_DPAD_DOWN;下
KeyEvent.KEYCODE_DPAD_LEFT;左
KeyEvent.KEYCODE_DPAD_RIGHT;右
KeyEvent.KEYCODE_DPAD_CENTER;确定键
KeyEvent.KEYCODE_DPAD_RIGHT;右
KeyEvent.KEYCODE_XXX:数字键(xx表示你按了数字几)
KeyEvent.KEYCODE_BACK;返回键
KeyEvent.KEYCODE_HOME;房子键
(2)dispatchKeyEvent
在了解这个之前,先熟悉下dispatchKeyEvent、onkeydown、onkeyup的关系,当键盘按下时首先触发dispatchKeyEvent,然后触发onUserInteraction再次onkeyDown如果按下紧接着松开,则是两步,紧跟着触发dispatchKeyEvent然后触发onUserInteraction再次onkeyUp。
- Android事件分发机制机制
- android 事件传递机制
- android 事件传递机制
- Android 广播事件机制
- Android事件触发机制
- android 事件流转机制
- Android 事件触发机制
- Android事件触发机制
- android事件传递机制
- Android事件处理机制
- android 事件机制
- android 事件处理机制
- android 事件机制
- Android事件传递机制
- Android 事件传递机制
- Android中的事件机制
- Android 事件传播机制
- Android事件传递机制
- ios 线程死锁
- 购物商城shopping连载(5)
- CSS hack
- plsql无法连接64位oracle数据库的解决方法(图文解说)
- Android学习之RecyclerView
- android事件机制
- PIC18F14k50 中断
- ExpandableListView(下拉列表)实现
- 在反向代理中添加例外
- Android:Layout_weight的深刻理解
- servlet下载文件到本地
- SpringMVC中hibernate中一对多关系,懒加载转JSON问题
- 【UVA 10561】 Treblecross|博弈论|SG函数
- 数据中心网络三大热门技术