当用户与UI控件发生某个事件(如按下、滑动、双击事件)时,程序会调用控件自己特定的方法处理该事件,这个处理过程就是基于回调机制的事件处理。
Android系统提供的回调方法:
方法 | 说明 |
---|---|
boolean onKeyDown(int keyCode,KeyEvent event) | 当用户在该控件上按下某个键时触发的方法 |
boolean onKeyUp(int keyCode,KeyEvent event) | 当用户在该控件上松开某个键时触发的方法 |
boolean onTouchEvent(MotionEvent event) | 当用户在该控件上触发触摸事件时触发的方法 |
boolean onFocusChanged(MotionEvent event) | 当用户在该控件上的焦点发生改变时触发的方法 |
这些回调机制的事件处理方法都有一个boolean类型的返回值,这个返回值用与标记当前事件是否已经处理完毕
(1)onKeyDown()方法
public boolean onKeyDown(int keyCode,KeyEvent event)
(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)
在事件监听的处理模型中主要设计3个方面:
监听的一般步骤
View类中的内部接口
接口名称 | 说明 |
---|---|
View.OnClickListener | 单击事件的事件监听器必须实现的接口 |
View.OnLongClickListener | 长按事件的事件监听器必须实现的接口 |
View.onFocusChangeListener | 焦点改变事件的事件监听器必须实现的接口 |
View.OnKeyListener | 按键事件的事件监听器必须实现的接口 |
View.OnTouchListener | 触摸事件的事件监听器必须实现的接口 |
? 该接口中需要实现的方法的定义方式:
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();
}
}
});
}
}
? 该接口需要实现的方法的定义方式:
public boolean onLongClick(View view)
? 该接口需要实现的方法的定义方式:
public boolean onFocusChange(View v,boolean hasFocus)
? 该接口需要实现的方法的定义方式:
public boolean onKey(View v,int keyCode,KeyEvent keyEvent)
public boolean onTouch(View v,MotionEvent motionEvent)
原文:https://www.cnblogs.com/qingying-wh/p/13770358.html