事件处理

事件处理概述

当用户在应用界面上执行各种操作时, 应用程序需要为用户的动作提供响应, 这种响应的过程就是事件处理.

1、基于监听的事件处理

监听三要素:

  1. Event Source (事件源)
  2. Event (事件)
  3. Event Listener (事件监听器)

实现监听事件的方法:

  1. 通过内部类实现.
  2. 通过匿名内部类实现.
  3. 通过事件源所在类实现.
  4. 通过外部类实现.
  5. 布局文件中 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事件处理主要方法,详解Android的两种事件处理机制

安卓开发学习12-2:Android事件处理和手势:物理按键事件处理

安卓开发学习12-4:Android事件处理和手势:手势检测

posted @   雨潇潇兮  阅读(149)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示