Android事件处理

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

监听的一般步骤

  1. 获取普通界面组件(事件源),即被监听的对象
  2. 实现事件监听器类
  3. 事件调用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:表示事件封装类的对象,其中包含了触摸事件的详细信息(例如:发生的事件,事件类型等信息)

Android事件处理

上一篇:appium 移动端 自动化测试


下一篇:Mybatis mapper文件占位符设置默认值