【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

Android 事件分发机制的自定义:为特殊情况实现自定义事件处理 (android studio)

用户投稿2024-04-19热门资讯15

在 Android 开发中,事件分发机制是一个负责处理所有用户输入和系统事件的复杂系统。它是一个由一组回调方法和类组成的分层系统,允许开发人员自定义如何处理特定的事件。

在某些情况下,您可能希望对默认事件分发机制进行自定义,以实现特定功能或处理通常被忽略的特殊事件。本文将指导您了解如何在 Android Studio 中自定义事件分发机制,并提供一些实现自定义事件处理的示例。

Android 事件分发机制概述

Android 事件分发机制由以下组件组成:

  • 事件:用户输入或系统生成的交互。
  • 视图:事件分发的目标。
  • 事件监听器:注册接收特定事件的类。
  • 事件分发者:管理事件分发的组件。

当事件发生时,它将传递给事件分发者,然后分发给视图层级中的适当视图。每个视图都有一个 onTouchEvent(MotionEvent) 方法,用于处理触摸事件。如果视图没有处理该事件,它将传递给父视图,依此类推,直到事件被处理或达到窗口根视图为止。

自定义事件分发

您可以通过以下步骤自定义事件分发机制:

  1. 创建自定义视图组:创建一个扩展 ViewGroup 的类,它将处理自定义事件。
  2. 覆盖 onInterceptTouchEvent(MotionEvent) 方法:此方法决定是否拦截事件。如果返回 true ,则事件将被拦截并不会传递给子视图。
  3. 处理自定义事件:在自定义视图组中定义自己的事件处理方法来处理自定义事件。

示例:处理长按事件

作为一个示例,让我们创建一个自定义视图组来处理长按事件。默认情况下,Android 并不直接处理长按事件,因此我们需要实现自己的处理方式。

步骤 1:创建自定义视图组

public class LongPressViewGroup extends ViewGroup {private float mLastX;private float mLastY;private long mStartTime;public LongPressViewGroup(Context context) {super(context);}
}

步骤 2:覆盖 onInterceptTouchEvent(MotionEvent) 方法

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX = event.getX();mLastY = event.getY();mStartTime = System.currentTimeMillis();break;case MotionEvent.ACTION_MOVE:float deltaX = Math.abs(event.getX() - mLastX);float deltaY = Math.abs(event.getY() - mLastY);if (deltaX > mTouchSlop || deltaY > mTouchSlop) {return false;
}break;case MotionEvent.ACTION_UP:long timeElapsed = System.currentTimeMillis() - mStartTime;if (timeElapsed > LONG_PRESS_DURATION) {return true;}break;}return false;
}

步骤 3:处理自定义事件

public void onLongPress(MotionEvent event) {// 在此处理长按事件
}

结论

通过自定义事件分发机制,您可以实现处理特殊情况的自定义事件处理,并增强您的 Android 应用程序的功能。通过在现有事件处理系统之上扩展,您可以创建满足特定需求的独特交互体验。


androidapp开发教程

AndroidApp开发是一项非常有趣和有用的技能,它可以让你创建出功能强大的应用程序,可以在Android设备上运行。在本教程中,我们将介绍如何使用AndroidStudio开发Android应用程序。AndroidStudio是一个功能强大的IDE(集成开发环境),可以让你轻松地创建和管理Android应用程序。本教程将介绍如何创建一个简单的Android应用程序,包括设置开发环境、创建项目、设计用户界面和添加功能。

步骤一:设置开发环境

在开始开发Android应用程序之前,你需要安装AndroidStudio和Java开发工具包(JDK)。你可以从AndroidStudio官方网站下载AndroidStudio,从Oracle官方网站下载JDK。安装完成后,打开AndroidStudio,选择“StartanewAndroidStudioProject”。

步骤二:创建项目

在创建新项目时,你需要设置应用程序的名称、包名、项目位置和最低支持的Android版本。你还可以选择要使用的模板和活动类型。在本教程中,我们将使用“EmptyActivity”模板,这将创建一个空的活动,并在其中添加一些基本的代码。

步骤三:设计用户界面

在设计用户界面时,你可以使用AndroidStudio的布局编辑器来创建和编辑XML布局文件。布局编辑器可以让你轻松地添加和编辑各种UI元素,如文本视图、按钮、图像视图等。你可以使用拖放功能将它们拖放到布局中,并使用属性编辑器对它们进行设置。在本教程中,我们将创建一个包含一个文本视图和一个按钮的简单布局。

步骤四:添加功能

在添加功能时,你需要编写Java代码来实现应用程序的逻辑。你可以在活动类中编写代码,这是应用程序的主要逻辑代码。在本教程中,我们将在活动类中添加一个按钮点击事件处理程序,当用户点击按钮时,将显示一个简单的消息。

请简述什么是android事件处理,并分析两种android事件处理机制的实现过程和区别

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

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

一 基于监听器的事件处理

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

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

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

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

举例:

View类中的OnLongClickListener监听器定义如下:(不需要传递事件)

[java] view plaincopyprint?

public interface OnLongClickListener {

boolean onLongClick(View v);

public interface OnLongClickListener {boolean onLongClick(View v);}

View类中的OnLongClickListener监听器定义如下:(需要传递事件MotionEvent)

[java] view plaincopyprint?

Android 事件分发机制的自定义:为特殊情况实现自定义事件处理 (android studio) 第1张

public interface OnTouchListener {

boolean onTouch(View v, MotionEvent event);

public interface OnTouchListener {boolean onTouch(View v, MotionEvent event);}

二 基于回调的事件处理

相比基于监听器的事件处理模型,基于回调的事件处理模型要简单些,该模型中,事件源和事件监听器是合一的,也就是说没有独立的事件监听器存在。当用户在GUI组件上触发某事件时,由该组件自身特定的函数负责处理该事件。通常通过重写Override组件类的事件处理函数实现事件的处理。

举例:

View类实现了接口中的一系列回调函数,因此,基于回调的事件处理机制通过自定义View来实现,自定义View时重写这些事件处理方法即可。

[java] view plaincopyprint?

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)定义事件监听器如下:

android事件分发机制 什么意思

android事件分发机制 就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,最后被消费的过程,在android中还是比较复杂的传递流程如下:(1) 事件从()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。 子View可以通过onTouchEvent()对事件进行处理。 (2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。 (3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。 (4) 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。 (5) OnTouchListener优先于onTouchEvent()对事件进行消费。 上面的消费即表示相应函数返回值为true。

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

Android 事件分发机制的自定义:为特殊情况实现自定义事件处理 (android studio) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!