事件
事件
在Android程序中,大部分都是图形界面,这些界面都是通过事件来实现人机交互的。Android中的事件主要有两种。
- 键盘事件:主要是指设备上的物理按键事件,例如,后退键的按下、菜单键的弹起等事件。
- 触摸事件:主要指的是对程序界面上的一些控件所做的动作,例如,双击、滑动等操作。
事件处理机制
针对Android中的事件,Android平台提供了两种事件处理机制
- 基于回调机制的事件处理
在Android平台中,每个View都有自己处理事件的回调方法,开发人员可以通过重写View中的这些回调方法来实现需要的响应事件,当某个事件没有被任何一个View处理时,便会调用Activity中相应的回调方法。
当用户与UI控件发生某个事件(如按下事件、滑动事件、双击事件)时,程序会调用控件自己特定的方法处理该事件,这个处理过程就是基于回调机制的事件处理。基于回调机制的事件处理包含处理物理按键事件和处理触摸事件。
(1)键盘事件
- onKeyDown()方法
当Android设备上的物理按键被按下时,程序会回调onKeyDown()方法,该方法是接口KeyEvent.Callback中的抽象方法。Android程序中所有的View都实现了KeyEvent.Callback接口并重写了onKeyDown()方法,该方法主要用于捕捉手机键盘被按下的事件
public boolean onKeyDown(int keyCode,KeyEvent event)
- keyCode:表示被按下的键值
- event:表示按键事件的对象,其中包含了触发事件的详细信息,例如事件的状态、事件的类型、事件的发生时间等
- onKeyUp()方法
当Android设备上的物理按键弹起时,程序会回调onKeyUp()方法,该方法是接口KeyEvent.Callback中的抽象方法。Android程序中所有的View都实现了KeyEvent.Callback接口并重写了onKeyUp()方法,该方法主要用于捕捉手机键盘弹起的事件
public boolean onKeyUp(int keyCode,KeyEvent event)
- onKeyUp()方法的2个参数的含义与onKeyDown()方法中对应参数的含义一样。
(2)触摸事件
- onTouchEvent()方法
该方法是在View中进行定义的,并且所有View的子类中全部重写了onTouchEvent()方法,Android程序可以通过该方法处理屏幕的触摸事件
public boolean onTouchEvent(MotionEvent event)
- 返回值为true时,表示已经完整地处理了事件,并不希望其他的回调方法继续对其进行处理,而为false时,表示并没有完全处理完事件,更希望其他回调方法继续对其进行处理
一般情况下,onTouchEvent()方法处理的事件分为三种
- MotionEvent.ACTION_DOWN:鼠标按下时
- MotionEvent.ACTION_UP:弹起事件
- MotionEvent.ACTION_MOVE:滑动事件
- onFocusChanged()方法
onFocusChanged()方法只能在View中重写。onFocusChanged()方法是焦点改变的回调方法,当某个控件重写了该方法后,焦点发生变化时,会自动调用该方法来处理焦点改变的事件
protected void onFocusChanged(boolean gainFocus,int direction,Rect previouslyFocusedRect)
- gainFocus:表示触发该事件的View是否获得了焦点,是为true
- direction:表示焦点移动的方向
- previouslyFocusedRect:表示在触发事件的View的坐标系中,前一个获得焦点的矩形区域,如果该参数不可以,则设置为null
- 基于监听接口的事件处理
基于监听接口的事件处理,最常见的做法就是为Android界面组件绑定特殊的事件监听器,例如,绑定点击事件的监听器OnClickListener。
(1)简介
基于监听事件处理是一种更“面向对象”的事件处理,在事件监听的处理模型中主要涉及三个对象
- EventSource(事件源):事件发生的场所,通常是指各个组件
- Event(事件):封装了界面组件发生的特定信息(通常指用户的一次操作)
- Event Listener(事件监听器):负责监听事件源所发生的事件,并对各种事件作出相应的响应
(2)流程
- 为某个事件源(界面组件)设置一个监听器,用于监听用户操作
- 当用户操作时,会触发事件源的监听器
- 生成对应的事件对象
- 将生成的事件对象作为参数传递给事件监听器
- 事件监听器对事件对象进行判断,执行对应的事件处理器
(3)View类中的内部接口
- OnClickListener接口
单击事件的事件监听器必须实现的接口
public void onClick(View v)
- v表示事件发生的事件源
- OnLongClickListener接口
长按事件的事件监听器必须实现的接口
public boolean onLongClick(View view)
- view:为事件源控件,当长时间按下该控件时才会触发该方法
- 返回值:该方法的返回值是一个boolean类型的变量,当该变量为true时,表示已经完整地处理了长按事件,并不希望其他回调方法继续对其进行处理
- OnFocusChangeListener接口
焦点改变事件的事件监听器必须实现的接口
public void onFocusChange(View v,boolean hasFocus)
- v:表示触发焦点发生改变事件的事件源
- hasFocus:表示v是否获取焦点
- OnKeyListener接口
按键事件的事件监听器必须实现的接口
public boolean onKey(View v,int keyCode,KeyEvent keyEvent)
- v:表示事件的事件源
- keyCode:表示键盘的键盘码
- keyEvent:表示键盘事件封装类的对象,其中包含了事件的详细信息
- OnTouchListener接口
触摸事件的事件监听器必须实现的接口
public boolean onTouch(View v,MotionEvent motionEvent)
- v:表示事件源
- motionEvent:表示事件封装类的对象,其中封装了触摸事件的详细信息,同样包括事件的类型、触发时间等信息