返回顶部
首页 > 资讯 > 移动开发 >详解Android的两种事件处理机制
  • 274
分享到

详解Android的两种事件处理机制

事件Android 2022-06-06 06:06:24 274人浏览 八月长安
摘要

UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理。 对于基于监听器的事件处理而言,主要就是为Andro

UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理。

对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事件监听器;对于基于回调的事件处理而言,主要做法是重写Android组件特定的回调函数,Android大部分界面组件都提供了事件响应的回调函数,我们主要重写它们就行。

一 基于监听器的事件处理

相比于基于回调的事件处理,这是更具“面向对象”性质的事件处理方式。在监听器模型中,主要涉及三类对象:

1)事件源Event Source:产生事件的来源,通常是各种组件,如按钮,窗口等。

2)事件Event:事件封装了界面组件上发生的特定事件的具体信息,如果监听器需要获取界面组件上所发生事件的相关信息,一般通过事件Event对象来传递。

3)事件监听器Event Listener:负责监听事件源发生的事件,并对不同的事件做相应的处理。

基于监听器的事件处理机制是一种委派式Delegation的事件处理方式,事件源将整个事件委托给事件监听器,由监听器对事件进行响应处理。这种处理方式将事件源和事件监听器分离,有利于提供程序的可维护性。

举例:

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);
}

二 基于回调的事件处理

相比基于监听器的事件处理模型,基于回调的事件处理模型要简单些,该模型中,事件源和事件监听器是合一的,也就是说没有独立的事件监听器存在。当用户在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); 
} 
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);
}

三、比对

基于监听器的事件模型符合单一职责原则,事件源和事件监听器分开实现;

Android的事件处理机制保证基于监听器的事件处理会优先于基于回调的事件处理被触发;

某些特定情况下,基于回调的事件处理机制会更好的提高程序的内聚性。

四、基于自定义监听器的事件处理流程

在实际项目开发中,我们经常需要自定义监听器来实现自定义业务流程的处理,而且一般都不是基于GUI界面作为事件源的。这里以常见的app自动更新为例进行说明,在自动更新过程中,会存在两个状态:下载中和下载完成,而我们的程序需要在这两个状态做不同的事情,“下载中”需要在UI界面上实时显示软件包下载的进度,“下载完成”后,取消进度条的显示。这里进行一个模拟,重点在说明自定义监听器的事件处理流程。

4.1)定义事件监听器如下:


public interface DownloadListener{
  public void onDownloading(int porgress);//下载过程中的处理函数
  public void onDownload();//下载完成的处理函数
}

4.2)实现下载操作的工具类代码如下:


public class DownloadUtils{
  private static DownloadUtils instance=null;
  private private(){
  }
  public static synchronized DownloadUtils instance(){
   if(instance==null){
   instance=new DownloadUtils();
   }
   returns instance;
  } 
}
private boolean is Downloading=ture;
private int progress=0;
//实际开发中这个函数需要传人url作为参数,以获取服务器端安装包位置
public void download(DownloadListener listener)throws interruptdeException{
while (isDownloading){
     listener.onDownloading(progress);
     //下载过程的简单模拟
 Thread.sleep(1000);
     progress+=10;
  if(progress>=100){
  isDownloading=false;
  }
}
//下载完成
listener.onDownload();
}
}

4.3)最后在main函数中模拟事件源:


public class DownloadUI{
  public static void main(sting[] args){
     try{
   DownloadUtils.instance().download(new MyDownloadListener());
 }catch(InterruptedExceptiob e){
 e.printStackTrace();
 }
 }
 private static class MyDownloadListener implements DownloadListener{
 @Override
public void onDownloading(int progress){
system.out.println("下载进度是:"+progress);
}
 @Override
public void onDownloaded(){
system.out.println("下载完成")
}
 }
}

运行一下的模拟程序,输入如下所示:

您可能感兴趣的文章:Android View 事件分发机制详解深入解析Android中的事件传递Android事件的分发机制详解详细分析Android中onTouch事件传递机制老生常谈android中的事件传递和处理机制


--结束END--

本文标题: 详解Android的两种事件处理机制

本文链接: https://lsjlt.com/news/23404.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Android的两种事件处理机制
    UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理。 对于基于监听器的事件处理而言,主要就是为Andro...
    99+
    2022-06-06
    事件 Android
  • Android事件处理的两种方式详解
    安卓提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理。 基于监听的事件处理 基于监听的事件处理一般包含三个要素,分别是: Event Source(事件源):事件发生...
    99+
    2023-02-28
    Android事件处理 Android事件处理机制 Android事件处理流程
  • Thinkphp事件机制两种实现方式详解
    目录一、通过监听二、通过订阅1、创建订阅类2、配置监听3、触发监听4、处理监听逻辑4.1 自动绑定4.2 手动绑定总结事件机制的实现有两种途径:通过监听、通过订阅 一、通过监听 1、...
    99+
    2024-04-02
  • node.js中的事件处理机制详解
    EventEmitter类 在Node.js的用于实现各种事件处理的event模块中,定义了一个EventEmitter类。所有可能触发事件的对象都是一个集成了EventEmitter类的子类的实例对象,在...
    99+
    2022-06-04
    详解 机制 事件
  • Android事件处理的两种方式是什么
    这篇文章主要讲解了“Android事件处理的两种方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android事件处理的两种方式是什么”吧!安卓提供了两种方式的事件处理:基于回调的事...
    99+
    2023-07-05
  • Android事件的分发机制详解
    在分析Android事件分发机制前,明确android的两大基础控件类型:View和ViewGroup。View即普通的控件,没有子布局的,如Button、TextView. ...
    99+
    2022-06-06
    Android
  • Android事件分发机制的详解
    Android事件分发机制我们只考虑最重要的四个触摸事件,即:DOWN,MOVE,UP和CANCEL。一个手势(gesture)是一个事件列,以一个DOWN事件开始(当用户触摸屏幕时产生),后跟0个或多个MOVE事件(当用户四处移动手指时产...
    99+
    2023-05-30
    android 事件 分发
  • Android事件分发机制(下) View的事件处理
    综述   在上篇文章Android中的事件分发机制(上)——ViewGroup的事件分发中,对ViewGroup的事件分发进行了详细的分析。在文章的最后ViewGroup的di...
    99+
    2022-06-06
    view Android
  • Android的Touch事件处理机制介绍
    Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后。 Android的Touch事件处理分3个层面:Activity层,ViewGroup层...
    99+
    2022-06-06
    touch Android
  • android事件处理机制是什么
    Android事件处理机制指的是Android系统中对用户输入事件以及其他系统事件的处理方式。Android系统中的事件处理机制主要包括以下几个部分:1. 事件触发:Android系统通过底层硬件驱动来获取用户输入事件,包括触摸事件、按...
    99+
    2023-08-11
    android
  • Android View 事件分发机制详解
    Android开发,触控无处不在。对于一些 不咋看源码的同学来说,多少对这块都会有一些疑惑。View事件的分发机制,不仅在做业务需求中会碰到这些问题,在一些面试笔试题中也常有人...
    99+
    2022-06-06
    view 事件 Android
  • Android View事件分发机制详解
    准备了一阵子,一直想写一篇事件分发的文章总结一下,这个知识点实在是太重要了。 一个应用的布局是丰富的,有TextView,ImageView,Button等,这些子View的外...
    99+
    2022-06-06
    view Android
  • Qt 事件处理机制的深入理解
    目录1.Qt中事件的来源,谁接收处理。2.事件处理顺序3.事件过滤器4.event方法5.鼠标进入事件6.accept(),ignore()1.Qt中事件的来源,谁接收处理。 Qt中...
    99+
    2024-04-02
  • Android View的事件分发机制简单理解
    View的事件分发机制1、前言2、基础2.1 MotionEvent类的基本用法。2.2事件分发的3个重要方法2.3分发事件的组件3.点击事件的...
    99+
    2022-06-06
    view 事件 Android
  • Android 深入探究自定义view之事件的分发机制与处理详解
    目录题引Activity对事件的分发过程父布局拦截的分发处理过程ACTION_DOWN 事件ACTION_MOVE 事件父布局不拦截时的分发处理过程ACTION_DOWNACTION...
    99+
    2024-04-02
  • 详解Node.js中的事件机制
    前言 在前端编程中,事件的应用十分广泛,DOM上的各种事件。在Ajax大规模应用之后,异步请求更得到广泛的认同,而Ajax亦是基于事件机制的。 通常js给我们的第一印象就是运行在客户端浏览器上面的脚本,通过...
    99+
    2022-06-04
    详解 机制 事件
  • Android View 事件防抖的两种方案
    目录两种方案侵入式防抖处理(NoShakeClickListener)Java 版本Kotlin版本RxJava2 clickExt.kt无侵入式防抖处理(NoShakeClickL...
    99+
    2024-04-02
  • JavaScript事件流:深入理解事件处理和传播机制
    引言 JavaScript中的事件流是一种机制,用于描述和处理事件在DOM树中的传播过程。了解事件流的属性和工作原理对于编写高效的事件处理代码和实现复杂的交互功能至关重要。本文将详细介绍JavaSc...
    99+
    2023-09-14
    javascript 开发语言 ecmascript 原力计划
  • Android之事件分发机制与冲突详解
    在日常的开发过程中,我们往往会在同一个界面中出现内外两层或者多层View同时滑动的现象,这个时候往往**会出现滑动冲突。面对滑动冲突,很多开发人员不知道从哪里入手,**即便稍微有点思...
    99+
    2024-04-02
  • 谈谈对Android View事件分发机制的理解
    最近因为项目中用到类似一个LinearLayout中水平布局中,有一个TextView和Button,然后对该LinearLayout布局设置点击事件,点击TextView能够...
    99+
    2022-06-06
    view Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作