KeyEvent.KEYCODE_BACK: 返回键。用于导航回上一个屏幕或关闭弹出的菜单或对话框。
KeyEvent.KEYCODE_MENU: 菜单键。通常用于打开一个上下文菜单或应用的主菜单。
KeyEvent.KEYCODE_HOME: 主页键。通常用于返回设备的主屏幕。
KeyEvent.KEYCODE_VOLUME_UP & KeyEvent.KEYCODE_VOLUME_DOWN: 音量增加和减少键。用于控制设备的音量。
KeyEvent.KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT: 方向键。用于在界面中导航,特别是在非触摸屏设备上。
KeyEvent.KEYCODE_DPAD_CENTER or KeyEvent.KEYCODE_ENTER: 确认键。用于选择当前聚焦的项目。
KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, KEYCODE_MEDIA_NEXT, KEYCODE_MEDIA_PREVIOUS: 媒体控制键。用于控制媒体播放。
轨迹球导航 (Trackball Navigation): 一些设备配备了轨迹球,用于在界面上导航。
键盘导航 (Keyboard Navigation): 使用键盘的方向键进行界面导航。
游戏手柄导航 (Gamepad Navigation): 使用游戏手柄上的摇杆或方向键进行界面导航。
在 Android 应用中处理按键事件通常涉及重写 Activity 或 View 的 onKeyDown 和 onKeyUp 方法。例如:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// 处理返回键的操作
return true;
}
return super.onKeyDown(keyCode, event);
}
焦点可以分为两种:窗口焦点和视图焦点
一个窗口只有在获得焦点时,才能接收到按键事件(如返回键、菜单键等)。
一个目的 :确保视图能够 正常 接收和处理 用户的输入
三个目标:
在代码中,可以调用视图的 requestFocus() 方法来申请焦点。例如,如果你想要一个 Button 在 Activity 启动时就获取焦点,你可以:
调用requestFocus方法
Button button = findViewById(R.id.my_button);
button.requestFocus();
也可以在 XML 布局文件中使用属性来指定某个视图应当获得焦点:
<Button
android:id="@+id/my_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Press Me"
android:focusable="true"
android:focusableInTouchMode="true" />
focusable 设置为 true 表示这个 Button 可以获得焦点,focusableInTouchMode 设置为 true 表示这个 Button 在触摸模式下也可以获得焦点。
当一个应用程序或视图请求焦点时,可能会触发系统行为,如显示或隐藏导航栏(也被称作 dock 栏)。
开发中经常会碰到这种需求:弹框弹出的时候不让dock栏一同弹出,当申请焦点 dock栏自动弹出分为下面几种情况:
代码如下:
View decorView = getWindow().getDecorView();
decorView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// Set the system UI visibility flags
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
});
触摸事件(Touch Events)是 用户与屏幕 的交互,比如点击(tap)、长按(long press)、滑动(swipe)等。
触摸事件涉及到事件分发,相关规则可以查看Andorid开发艺术探索
比如,在一个 ScrollView 中滑动屏幕,视图可以处理滑动事件,即使它没有焦点。
例如,当一个 Button 获得焦点后,用户可以通过按下硬件键盘的 Enter 键来触发点击事件。
焦点转移:用户触摸屏幕上的一个可聚焦的视图时,该视图可能获取焦点(如果它的 isFocusableInTouchMode 设置为 true)。
焦点决定键盘输入:例如,当一个 EditText 获得焦点后,它可以接收键盘输入。
触摸事件可以改变焦点状态:
例如,当用户在一个 ListView 中触摸一个条目时,该条目可能获得焦点。
如果窗口是可以聚焦的 则 可以响应按键事件,其内部的视图也可以响应触摸事件。
如果窗口不可以聚焦 ,触摸事件仍然可以被内部视图捕获,但按键事件将可能被后面的窗口处理。
设置不可聚焦不获取焦点的视图:如果触摸了一个 isFocusable 设置为 false 的视图,它将不会获得焦点,但它仍然可以处理触摸事件。
已经获取了焦点,该视图可以直接处理触摸事件,焦点状态不会改变。
当前没有焦点但是设置了可聚焦的状态,该视图可能会获得焦点,并处理触摸事件。
总结一下:
一个没有焦点的视图可以接收触摸事件,但无法接收键盘等导航事件。
反之,一个有焦点的视图可以响应键盘事件,并且如果它是可触摸的,也可以响应触摸事件。
焦点只是决定你是否能够响应物理按键和键盘和无障碍服务,且任何一个时间只能有一个视图持有焦点,而触摸事件 可以决定让哪个视图拥有焦点(通过可聚焦状态和触摸事件的位置)
事件分发和视图是否持有焦点无关,在多窗口环境中,触摸事件首先被最上层的窗口捕获,如果这个窗口不消费(consume)该事件,事件可以继续向下传递至下一个窗口。
在多窗口环境中,焦点是用来确定哪个视图或窗口将接收键盘输入或导航事件。如果新弹出的窗口没有申请焦点,那么焦点还在原窗口上;否则就会进行流转。