这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
输入事件
概述
当我们点击屏幕与应用交互时,每一次点击、长按、移动等都会产生事件,该片文章为事件分发做铺垫。
事件监听器
| 方法名 | 介绍 |
|---|---|
| onClick() | 在 View.OnClickListener 中,处理单击事件或者单击轨迹球都会触发该事件 |
| onLongClick() | 在 View.OnLongClickListener 中长按事件,当长时间按住某个 View 组件时触发该事件 |
| onFocusChange() | 在 View.OnFocusChangeListener 中,此接口用于处理 View 组件焦点改变事件。当用户使用导航键或轨迹球转到或离开项目时,系统会调用此方法 |
| onKey() | 此接口用于对手机键盘事件进行监听,当View获得焦点并且键盘被敲击时会触发该事件,每次点击都会触发KeyEvent.ACTION_DOWN和KeyEvent.ACTION_UP |
| onTouch() | 在 View.OnTouchListener 中,当用户执行可视为触摸事件的操作时,包括按下、释放或屏幕上的任何移动手势(在项目边界内),系统会调用此方法。 |
| onCreateContextMenu() | 在 View.OnCreateContextMenuListener 中。当(因用户持续“长按”而)生成上下文菜单时,系统会调用此方法。 |
public interface OnClickListener {
void onClick(View v);
}
public interface OnFocusChangeListener {
void onFocusChange(View v, boolean hasFocus);
}
public interface OnLongClickListener {
boolean onLongClick(View v);
}
public interface OnTouchListener {
/**
* MotionEvent内封装了
*/
boolean onTouch(View v, MotionEvent event);
}
从上述代码可以发现除了onClick之外均有一个boolean的返回值,返回 true 表示已处理事件且事件应就此停止;如果尚未处理事件且/或事件需要继续传递给其他任何点击监听器,则返回 false。
事件处理程序
事件处理程序也就是事件监听器里函数式接口中的方法。
onKeyDown(int, KeyEvent):在发生新的按键事件时调用。onKeyUp(int, KeyEvent):在发生 key up 事件时调用。onTrackballEvent(MotionEvent):在发生轨迹球动作事件时调用。onTouchEvent(MotionEvent):在发生触屏动作事件时调用。onFocusChanged(boolean, int, Rect):在 View 对象获得或失去焦点时调用,监听View焦点状态。只能在 View 中重写,当 View 组件焦点改变时被自动调用。
还有一些其他方法值得注意,尽管它们并非 View 类的一部分,但可能会直接影响所能采取的事件处理方式。
Activity.dispatchTouchEvent(MotionEvent):此方法允许Activity在所有触摸事件分派给窗口之前截获它们。ViewGroup.onInterceptTouchEvent(MotionEvent):此方法允许ViewGroup监视分派给子级 View 的事件。ViewParent.requestDisallowInterceptTouchEvent(boolean):对父级 View 调用此方法,可指示不应使用onInterceptTouchEvent(MotionEvent)截获触摸事件。