Android事件处理
- 掌握回调机制的事件处理方法,学会处理相关事件
- 掌握基于监听接口机制的事件处理方法,学会处理相关事件
- 掌握手势的创建、到处与识别的相关知识,可以实现手势识别的功能
- 掌握Handler消息机制原理,会使用Handler进行线程间通信
graph TB
Android中的事件-->键盘事件 & 触摸事件
Android中的事件处理机制-->居于回调机制的事件处理 & 基于监听接口的事件处理
1.基于回调机制的事件处理
当用户与UI控件发生某个事件(如按下、滑动、双击事件)时,程序会调用控件自己特定的方法处理该事件,这个处理过程就是基于回调机制的事件处理。
Android系统提供的回调方法:
方法 | 说明 |
---|---|
boolean onKeyDown(int keyCode,KeyEvent event) | 当用户在该控件上按下某个键时触发的方法 |
boolean onKeyUp(int keyCode,KeyEvent event) | 当用户在该控件上松开某个键时触发的方法 |
boolean onTouchEvent(MotionEvent event) | 当用户在该控件上触发触摸事件时触发的方法 |
boolean onFocusChanged(MotionEvent event) | 当用户在该控件上的焦点发生改变时触发的方法 |
这些回调机制的事件处理方法都有一个boolean类型的返回值,这个返回值用与标记当前事件是否已经处理完毕
- 当返回为true时,表示已经完整处理了 事件,并不希望其它的回调方法再次进行处理
- 当返回为false时,表示并没有完全处理完事件,更希望其它的回调方法继续对其进行处理
(1)onKeyDown()方法
public boolean onKeyDown(int keyCode,KeyEvent event)
- keyCode:表示被按下的键值(键盘码)
(2)onKeyUp()方法
public boolean onKeyDown(int keyCode,KeyEvent event)
? onKeyDown()方法和onKeyUp()方法是接口KeyEvent.Callback中的抽象方法。Android中的所有View都实现了KeyEVent.Callback接口并重写了onKeyDown()方法
/*示例代码
通过onKeyDown()方法来屏幕后退键以及在该方法中通过Toast来提示用户增加音量的信息
*/
public class MainActivity extends AppCompatActivity{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //设置页面布局
}
public boolean onKeyDown(int keyCode,KeyEvent event){
if(keyCode==KeyEvent.KEYCODE_BACK){ //点击了后退键
Toast.makeText(this,"点击了后退键",Toast.LENGHT_SHORT).show();
return true; //屏蔽后退键
}else if(keyCode==KeyEvent.KEYCODE_VOLUME_UP){ //点击了音量增加键
Toast.makeText(this,"音量增加",Toast.LENGHT_SHORT).show();
return true;
}
return super.onKeyDown(keyCode,event);
}
}
? Android设备可用物理按键及其触发事件:
物理按键 | KeyEvent | 说明 |
---|---|---|
电源键 | KEYCODE_POWER | 启动或唤醒设备,将界面切换到锁定的屏幕 |
后退键 | KEYCODE_BACK | 返回到前一个界面 |
Home键 | KEYCODE_HOME | 返回到Home界面 |
相机键 | KEYCODE_CAMERA | 启动相机 |
音量键 | KEYCODE_VOLUME_UP | 控制当前上下文音量(如音乐播放器,手机铃声,通话音量等) |
KEYCODE_VOLUME_DOWN |
(3)onTouchEvent()方法
? 该方法是在View类中定义的,并且所有的View的子类中全部重写了onTouchEvent()方法
public boolean OnTouchEvent(MotionEvent event)
? 当屏幕被触摸时,会自动调用onTouchEvent()方法来处理事件,通过该方法中的event.getAction()方法的值来判断触摸事件。
? 一般情况下,onTouchEvent()方法处理的事件分为三种:
值 | 描述 |
---|---|
ACTION_DOWN | 屏幕被按下 |
ACTION_UP | 屏幕被弹起 |
ACTION_MOVE | 在屏幕中拖动 |
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyButton button = new MyButton(this); //创建一个自定义的Button对象
button.setText("hello"); //设置Button控件的文本
button.setTextSize(20); //设置Button控件的文本大小
button.setAllCaps(false); //设置Button控件原样输出文本
setContentView(button); //将按钮设置到界面上
}
class MyButton extends Button{ //自定义一个Button控件
public MyButton(Context context){
super(context);
}
public boolean onTouchEvent(MotionEvent event){ //重写触摸事件的处理方法
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this,"被按下",Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this,"被弹起",Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_MOVE:
Toast.makeText(MainActivity.this,"被拖动",Toast.LENGTH_SHORT).show();
break;
}
return super.onTouchEvent(event);
}
}
}
(4)onFocusChanged()方法
? 该方法只能在View中重写。
public void onFocusChanged(boolean gainFocus,int direction,Rect previouslyFocusedRect)
- gainFocus:表示触发该事件的View是否获得了焦点,当控件获取焦点时,参数gainFocus的值为true,否则为false
- direction:表示焦点移动的方向,用数值来表示
- previouslyFocusedRect:表示在触发事件的View的坐标系中,前一个获得焦点的矩形区域。如果该参数不可用,则设置为null
2.基于监听接口的事件处理
在事件监听的处理模型中主要设计3个方面:
- Event Source(事件源):事件发生的场所,通常是各个组件
- Event(事件):封装了界面组件发生的特定事情(通常指用户的一次操作),如果程序需要获取界面组件发生事件的相关信息,可以通过Event对象获取
- Event Listener(事件监听器):负责监听事件源发生的事件,并对各种事件作出相应的响应
graph TB
A[外部操作]-->|2.触发事件源上的事件|B[Event Source]
B-->|3.生成事件对象|C[Event]
C-->|4.触发事件监听器,射箭本身作为参数传入到事件处理器|D[EventListener]
D-->|5.调用事件处理器处理事件|E1[事件处理器]
D-->|1.将事件监听器注册到事件源|B
监听的一般步骤
- 获取普通界面组件(事件源),即被监听的对象
- 实现事件监听器类
- 事件调用setXxxListener()方法,将事件监听器对象注册给普通组件(事件源)
View类中的内部接口
接口名称 | 说明 |
---|---|
View.OnClickListener | 单击事件的事件监听器必须实现的接口 |
View.OnLongClickListener | 长按事件的事件监听器必须实现的接口 |
View.onFocusChangeListener | 焦点改变事件的事件监听器必须实现的接口 |
View.OnKeyListener | 按键事件的事件监听器必须实现的接口 |
View.OnTouchListener | 触摸事件的事件监听器必须实现的接口 |
1.OnClickListener接口
? 该接口中需要实现的方法的定义方式:
public void onClick(View v)
/*示例代码*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button button;
protected void onCreate(Bundle SavedInstanceState){
super.onVreate(SavedInstanceState);
setContentView(R.layout.activity_main); //设置MainActivity对应的布局文件
button = (Button) findViewById(R.id.button); //获取界面上的按钮控件
button.setOnClickListener(this); //注册监听器
}
public void onClick(View v){ //实现点击事件的监听方法
if(v==button){ //判断点击的控件是否时button
Toast.makeText(MainActivity.this,"点击了按钮",Toast.LENGTH_SHORT).show();
}
}
}
? ??????????????????
? 通过匿名内部类实现OnClickListener接口
/*示例代码*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button button;
protected void onCreate(Bundle SavedInstanceState){
super.onVreate(SavedInstanceState);
setContentView(R.layout.activity_main); //设置MainActivity对应的布局文件
button = (Button) findViewById(R.id.button); //获取界面上的按钮控件
//通过匿名内部类来实现OnClickListener接口
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(v==button){
Toast.makeText(MainActivity.this,"点击了按钮",Toast.LENGTH_SHORT).show();
}
}
});
}
}
2.OnLongClickListener接口
? 该接口需要实现的方法的定义方式:
public boolean onLongClick(View view)
3.OnFocusChangeListener接口
? 该接口需要实现的方法的定义方式:
public boolean onFocusChange(View v,boolean hasFocus)
- v:表示触发焦点发生改变事件的事件源
- hasFoucs:表示v是否获取焦点
4.OnKeyListener接口
? 该接口需要实现的方法的定义方式:
public boolean onKey(View v,int keyCode,KeyEvent keyEvent)
- keyCode:表示键盘的键盘码
- keyEvent:表示键盘事件封装类的对象,其中包含了事件的详细信息(例如:发生的事件,事件类型等信息)
5.OnTouchListener接口
public boolean onTouch(View v,MotionEvent motionEvent)
- motionEvent:表示事件封装类的对象,其中包含了触摸事件的详细信息(例如:发生的事件,事件类型等信息)