事件处理
事件处理概述
当用户在应用界面上执行各种操作时, 应用程序需要为用户的动作提供响应, 这种响应的过程就是事件处理.
1、基于监听的事件处理
监听三要素:
- Event Source (事件源)
- Event (事件)
- Event Listener (事件监听器)
实现监听事件的方法:
- 通过内部类实现.
- 通过匿名内部类实现.
- 通过事件源所在类实现.
- 通过外部类实现.
- 布局文件中 OnClick 属性 (针对点击事件).
举例:
// View类中的OnLongClickListener监听器定义如下:(不需要传递事件)
public interface OnLongClickListener { boolean onLongClick(View v); } public interface OnLongClickListener { boolean onLongClick(View v); } // View类中的OnLongClickListener监听器定义如下:(需要传递事件MotionEvent) public interface OnTouchListener { boolean onTouch(View v, MotionEvent event); } public interface OnTouchListener { boolean onTouch(View v, MotionEvent event); }
2、基于回调的事件处理
相比基于监听器的事件处理模型,基于回调的事件处理模型要简单些,该模型中,事件源和事件监听器是合一的,也就是说没有独立的事件监听器存在。当用户在GUI组件上触发某事件时,由该组件自身特定的函数负责处理该事件。通常通过重写Override组件类的事件处理函数实现事件的处理。
举例:
View类实现了KeyEvent.Callback接口中的一系列回调函数,因此,基于回调的事件处理机制通过自定义View来实现,自定义View时重写这些事件处理方法即可。
public interface Callback { // 几乎所有基于回调的事件处理函数都会返回一个boolean类型值,该返回值用于 // 标识该处理函数是否能完全处理该事件 // 返回true,表明该函数已完全处理该事件,该事件不会传播出去 // 返回false,表明该函数未完全处理该事件,该事件会传播出去 boolean onKeyDown(int keyCode, KeyEvent event); boolean onKeyLongPress(int keyCode, KeyEvent event); boolean onKeyUp(int keyCode, KeyEvent event); boolean onKeyMultiple(int keyCode, int count, KeyEvent event); }
3、比对
基于监听器的事件模型符合单一职责原则,事件源和事件监听器分开实现;
Android的事件处理机制保证基于监听器的事件处理会优先于基于回调的事件处理被触发;
某些特定情况下,基于回调的事件处理机制会更好的提高程序的内聚性。
物理按键事件处理
物理按键的三种状态
- onKeyDown:按下物理按键
- onKeyUp:松开物理按键
- onKeyLongPress:长按
物理按键所对应的常量上述监听第三个监听状态的方法,是通用的基于回调的事件处理,也就是所有物理按键的按下和松开都会触发上述的onKeyDown和onKeyUp方法
安卓系统中提供了对应的常量来区分不同的物理按键
音量上、下:KEYCODE_VOLUME_UP、KEYCODE_VOLUME_DOWN
电源键:KEYCODE_POWER
返回键:KEYCODE_BACK
主屏键:KEYCODE_HOME
菜单键:KEYCODE_MENU
触摸屏事件处理
单击事件
Button jump = findViewById(R.id.jump); jump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } });
长按事件
imageView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //其他代码 return false; } });
触摸事件
imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { //其他代码 return false; } });
单击事件和触摸事件的区别
系统首先是触发触摸事件,然后才是单击事件。在onTouch方法中返回了false,表示经过触摸方法后还会继续往后执行,交给后边的事件处理器处理,如果返回true,那么运行完onTouch方法后就不继续向后执行。
手势
手势监听的GestureDetector
安卓实现手势检测需要GestureDetector类,代表一个手势检测器
创建手势检测器需要实现GestureDetector.OnGestureListener接口
触发顺序:onDown->onShowPress->onSingleTapUp
创建GestureDetector.OnGestureListener接口的实例需要重写以下六个方法:
// 手指按下 @Override public boolean onDown(MotionEvent motionEvent) { return false; } // down事件发生而move或者up还没发生前触发该事件 @Override public void onShowPress(MotionEvent motionEvent) { } // 点击后抬起,并且点击后没有滑动 @Override public boolean onSingleTapUp(MotionEvent motionEvent) { return false; } // 滚动屏幕 @Override public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { return false; } // 长按 @Override public void onLongPress(MotionEvent motionEvent) { } // 滑动 @Override public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { return false; }
参考:
android事件处理主要方法,详解Android的两种事件处理机制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理