6.Android学习之Android事件处理和手势(一)

2023-11-07

目录

6.Android事件处理和手势(一)

1.事件处理概述

1-1.基于监听的事件处理

1-2.基于回调的事件处理

2.物理按键事件处理

3.触摸屏事件处理

3-1.单击事件

3-2.长按事件

3-3.触摸事件


6.Android事件处理和手势(一)

1.事件处理概述

现在的图形界面应用程序都是通过事件来实现人机交互的。事件就是用户对图形界面的操作。在Android手机和平板电脑上,主要包括物理按键事件和触摸屏事件两大类。物理按键事件包括按下、抬起和长按等;触摸屏事件包括按下、拾起、滑动和双击等。

在Android组件中提供了事件处理的相关方法。例如,在View类中提供了onTouchEvent() 方法,可以重写该方法来处理触摸屏事件,这种方式主要适用于重写组件的场景,但是仅仅通过重写这个方法来完成事件处理是不够的。为此,Android 提供了使用setOnTouchListener()方法为组件设置监听器来处理触摸屏事件,这在日常开发中更加常用。

在Android中提供了两种方式的事件处理,一种是基于监听的事件处理,另一种是基于回调的事件处理。

1-1.基于监听的事件处理

实现基于监听的事件处理,主要做法就是为Android的UI组件绑定特定的事件监听器。在事件监听的处理模型中,主要有以下3类对象:

◆Event Source (事件源) :即产生事件的来源,通常是各种组件,例如,按钮、窗口和菜单等。

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

◆Event Listener (事件监听器) :监听事件源所发生的事件,并对不同的事件做出相应的响应。

1-2.基于回调的事件处理

实现基于回调的事件处理,主要做法就是重写Android组件特定的回调方法,或者重写Activity组件的回调方法。从代码实现的角度看,基于回调的事件处理模型更加简单。为了使用回调机制来处理GUI组件(图形用户界面)上所发生的事件,需要为该组件提供对应的事件处理方法,可以通过继承GUI组件类,并重写该类的事件处理方法来实现。

为了实现回调机制的事件处理,Android为所有GUI组件都提供了一些事件处理的回调方法, 例如,在View类中就包含了一些事件处理的回调方法,这些方法如表6.1所示。

表6.1 View类中事件处理的回调方法

方法 说明
boolean onKeyDown(int keyCode, KeyEvent event) 当用户在该组件上按下某个按键时触发
bolean onKeyLongPress(int keyCode, KeyEvent event) 当用户在该组件上长按某个按键时触发
boolean onKeyShortcut(int keyCode, KeyEvent event) 当一个键盘快捷键事件发生时触发
boolean onKeyUp(int keyCode, KeyEvent event) 当用户在该组件上松开某个按键时触发
boolean onTouchEvent (MotionEvent event) 当用户在该组件上触发触摸屏事件时触发
boolean onTrackballEvent(MotionEvent event) 当用户在该组件上触发轨迹球事件时触发

一般来说,基于回调的事件处理方式可用于处理一些通用性的事件,事件处理的代码会比较简洁。但对于某些特定的事件,无法采用基于回调的事件处理方式实现时,就只能采用基于监听的事件处理方式了。

2.物理按键事件处理

一个标准的 Android设备包含了多个能够触发事件的物理按键。

Android设备常用物理按键能够触发的事件及其说明如表6.2所示。

表6.2 Android 设备可用物理按键及其触发事件

物理按键 KeyEvent 说明
音量键 KEYCODE_VOLUME_UP KEYCODE_VOLUME_DOWN 控制当前上下文音量,如音乐播放器、手机铃声、通话音量等
返回键 KEYCODE_ BACK 返回到前一个界面
菜单键 KEYCODE_MENU 显示当前应用的可用菜单

在Android中处理物理按键事件时,常用的回调方法有以下3个:

◆onKeyUp():当用户松开某个按键时触发该方法。

◆onKeyDown():当用户按下(未松开)某个按键时触发该方法。

◆onKeyLongPress():当用户长按某个按键时触发该方法。

例:

MainActivity.java

package com.example.exitmapapplication;
​
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
​
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;
​
public class MainActivity extends AppCompatActivity {
    private long exitTime = 0;//退出时间变量值
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar=getSupportActionBar();
        actionBar.hide();
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event){
        //判断是否单击了返回按钮
        if(keyCode==KeyEvent.KEYCODE_BACK){
            exit();//创建并调用退出方法
            return true;//拦截返回键
        }
        return super.onKeyDown(keyCode, event);
    }
​
    private void exit() {
        if((System.currentTimeMillis() - exitTime)>2000){//计算按键时间差是否大于两秒
            Toast.makeText(getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT).show();
            exitTime=System.currentTimeMillis();
        }else {
            finish();
            System.exit(0);//销毁强制退出
        }
    }
}

3.触摸屏事件处理

当下,主流的Android手机、平板电脑都以较大的屏幕取代了外置键盘,很多操作都是通过触摸屏幕来实现的。其中,常用的触摸屏事件主要包括单击事件、 长按事件和触摸事件等。

3-1.单击事件

在手机应用中,经常需要实现在屏幕中单击某个按钮或组件执行一些操作。这时就可以通过单击事件来完成。在处理单击事件时,可以通过为组件添加单击事件监听器的方法来实现。Android为组件提供了setOnClickListener()方法,用于为组件设置单击事件监听器。该方法的参数是一个View.OnClickListener接口的实现类对象。View.OnClickListener 接口的定义如下:

public static interface View.OnClickListener{
    public void onClick(View v);
}

从上面接口的定义中可以看出,在实现View.OnClickListener接口时,需要重写onClick()方法。当单击事件触发后,将调用onClick()方法执行具体的事件处理操作。

例如,要为名称为“button1”的按钮添加一个单击事件监听器,并且实现在单击该按钮时弹出消息提示框显示“单击了按钮”,可以通过下面的代码实现:

Button button1=new Button(this);
button1.setOnClicklistener(new View.OnClicklistener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this,"单击了按钮",Toast.LENGTH_SHORT).show();
    }
});

3-2.长按事件

在Android中还提供了长按事件的处理操作,长按事件与单击事件不同,该事件需要长按某一个组件2秒之后才会触发。在处理长按事件时,可以通过为组件添加长按事件监听器的方法来实现。

Android 为组件提供了setOnLongClickListener()方法,用于为组件设置长按事件监听器。该方法的参数是一个View.OnLongClickListener接口的实现类对象。View.OnLongClickListener 接口的定义如下:

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

从上面接口的定义中可以看出,在实现View.OnLongClickListener 接口时,需要重写onLongClick()方法,当长按事件触发后,将调用onLongClick()方法执行具体的事件处理操作。

例:

 

MainActivity.java

package com.example.longpressevent;
​
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
​
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.View;
import android.widget.ImageView;
​
public class MainActivity extends AppCompatActivity {
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar=getSupportActionBar();
        actionBar.hide();
        ImageView imageView = (ImageView) findViewById(R.id.main_iv2);//获取图片组件
        //创建长按监听事件
        imageView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                registerForContextMenu(view);//将长按事件注册到菜单中
                openContextMenu(view);//打开菜单
                return true;
            }
        });
    }
    @Override
    public void onCreateContextMenu(ContextMenu menu,View v,
                                    ContextMenu.ContextMenuInfo menuInfo){//创建菜单
        super.onCreateContextMenu(menu,v,menuInfo);
        //为菜单添加参数
        menu.add("收藏");
        menu.add("举报");
    }
}

在AndroidManifest.xml文件中修改<application>标记的android:theme属性:

android:theme="@style/Theme.AppCompat.Light.DarkActionBar"

3-3.触摸事件

触摸事件就是指当用户触摸屏幕之后产生的一种事件,当用户在屏幕上划过时,可以通过触摸事件获取用户当前的坐标。在处理触摸事件时,可以通过为组件添加触摸事件监听器的方法来实现。

Android为组件提供了setOnTouchListener()方法,用于为组件设置触摸事件监听器。该方法的参数是一个 View.OnTouchListener接口的实现类对象。View.OnTouchListener 接口的定义如下:

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

从上面接口的定义中可以看出,在实现View.OnTouchListener接口时需要重写onTouch(方法。当触摸事件触发后,将调用onTouch()方法执行具体的事件处理操作,同时会产生一个MotionEvent事件类的对象,通过该对象可以获取用户当前的X坐标和Y坐标。

例:

MainActivity.java

package com.example.touchevents;
​
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
​
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
​
public class MainActivity extends AppCompatActivity {
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar=getSupportActionBar();
        actionBar.hide();
        //获取相对布局管理器
        RelativeLayout relativeLayout=(RelativeLayout) findViewById(R.id.qie);
        final HatView hat = new HatView(MainActivity.this);//创建并实例化HatView类
        //为帽子添加触摸事件监听器
        hat.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                hat.bitmapY=motionEvent.getX()-80;//设置帽子显示位置的X坐标
                hat.bitmapY=motionEvent.getY()-50;//设置帽子显示位置的Y坐标
                hat.invalidate();//重绘hat组件
                return true;
            }
        });
        relativeLayout.addView(hat);//将hat添加到布局管理器中
    }
}

HatView.java

package com.example.touchevents;
​
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
​
public class HatView extends View {
    public float bitmapX;//帽子显示位置的X坐标
    public float bitmapY;//帽子显示位置的Y坐标
    public HatView(Context context) {//重写构造方法
        super(context);
        bitmapX=295;//帽子默认显示位置的X坐标
        bitmapY=0;//帽子默认显示位置的Y坐标
    }
    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        Paint paint=new Paint();//创建Paint对象
        //根据图片生成位图对象
        Bitmap bitmap= BitmapFactory.decodeResource(this.getResources(),R.drawable.hat);
        canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);//绘制帽子
        if(bitmap.isRecycled()) {//判断图片是否回收
            bitmap.recycle();//强制回收图片
        }
    }
}
​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

6.Android学习之Android事件处理和手势(一) 的相关文章

随机推荐

  • matlab绘制三维图形

    matlab绘制三维图形 三维曲线 plot3函数与plot函数用法十分相似 其调用格式为 plot3 x1 y1 z1 选项1 x2 y2 z2 选项2 xn yn zn 选项n 其中每一组x y z组成一组曲线的坐标参数 选项的定义和p
  • Spring Boot + Vue的网上商城之商品订单售后退款退货实现

    Spring Boot Vue的网上商城之商品订单售后退款退货实现 思路 在网上商城中 商品订单售后退款退货是一个必不可少的功能 当用户购买的商品有质量问题或者不满意时 可以申请售后服务 包括退款 退货等操作 在这篇博客中 我们将介绍如何使
  • sapi 实现语音朗读

    头文件定义 CSpeechSpeekImpl h pragma once include sphelper h class CSpeechSpeekImpl public CSpeechSpeekImpl void CSpeechSpeek
  • 如何在React中使用@符书写文件路径

    在 Vue 中 我们导入文件时 文件路径中可以使用 符号指代src目录 极大的简化了我们对路径的书写 但是 react 中 要想实现这种方式书写文件路径 需要写配置文件来实现 在 config overrides js 文件中书写如下代码
  • js改变html文本的方法,javascript怎么改变文本内容

    javascript改变文本内容的方法 首先使用 document getElementById 元素id值 语句获取到元素对象 然后使用innerHTML属性来改变文本内容 语法格式 元素对象 innerHTML text 本教程操作环境
  • 报错为method does not override method from its superclass解决方案

    这个错误一般出现在 Override注解上面 意思是重写接口中的方法必须在实现类中实现接口 在实现类上通过implements 实现相关接口即可 例如 public class Welcome implements Job 后面通过 imp
  • PaddleDetection在window使用

    PaddleDetection安装 安装文档看这里 1 安装paddle环境 之前安装过了就不做介绍了 2 安装PaddleDetection 克隆PaddleDetection仓库 cd
  • mac vscode 打开新文件只显示一个tab的解决方案

    一开始是好的 后面不知道怎么弄成了点开一个文件会把之前的文件都给覆盖掉 搜了一小会功夫 这里记录一次 首先在 vscode目录下有个settings json文件 在文件里面可能如下显示 workbench editor showTabs
  • partially initialized module ‘cv2‘;module ‘cv2‘ has no attribute;cv2.error: OpenCV(4.7.0) D:\a\pencv

    在使用超像素语义分割时会遇到的错误 AttributeError partially initialized module cv2 has no attribute gapi wip gst GStreamerPipeli Attribut
  • 【kubernetes】安全机制

    目录 安全机制 认证 Authentication 鉴权 Authorization 准入控制 Admission Control 实践 安全机制 机制说明 Kubernetes 作为一个分布式集群的管理工具 保证集群的安全性是其一个重要的
  • 深度

    导语 zap是uber开源的Go高性能日志库 本文作者深入分析了zap的架构设计和具体实现 揭示了zap高效的原因 并且对如何构建高性能Go语言库给出自己的建议 作者简介 李子昂 美图公司架构平台系统研发工程师 从事长连接服务和分布式存储组
  • PostgreSQL使用pg_dump导出单个数据表的insert语句

    PostgreSQL自带的pgadmin4工具没有办法生成数据表的insert语句 这使得想要提取单个表的数据 插入到不同环境的相同表中变成很麻烦的一件事 使用PostgreSQL的pg dump工具可以实现该功能 目录 使用效果 操作过程
  • table 嵌套table 让内部table高度填满外部的td

    需要在外层的父table增加属性style height 100 然后内部table增加style height 100 才会生效 这样的效果是内层的table会跟着外层的高度变化而变化 不是那种设置固定高度无法动态变化的写法
  • java Desktop 使用样例

    package test import java awt Desktop import java io File import java net URI public class DeskTopTest private static Des
  • springboot+微信公众号 实现给女盆友定时发送消息

    springboot 微信公众号 实现给女盆友定时发送消息 1 准备工作 申请微信公众号的测试平台 地址 https mp weixin qq com 注意保存以上三个部分 第一个是公众号的ID和秘钥 第二个是扫码关注你的公众号 也就是消息
  • -day28索引和函数及存储过程

    day28 索引和函数及存储过程 课程目标 了解MySQL中索引 函数 存储过程 函数 触发器 视图等知识点 课程概要 索引 函数 存储过程 视图 触发器 1 索引 在数据库中索引最核心的作用是 加速查找 例如 在含有300w条数据的表中查
  • 深度探索C++对象模型 学习笔记 第一章 关于对象

    宏定义 define Point3d print pd printf g g g pd gt x pd gt y pd gt z g表示自动选择合适的表示法输出 在C 中 可以通过抽象数据类型ADT 一个class中的成员函数 实现 纯C的
  • react学习小记

    React react和vue的不同 vue 双向数据流 他的数据绑定依赖数据劫持 object defineProperty 中的getter 和 setter 更形视图是采用 MVVM React 单向数据流 依赖 onChange s
  • SpringBoot集成webservice

    前言 之前在工作中 有时候需要去对接第三方的医院 而很多医院的his系统用的都是老技术 WebService 一直在对接webservice接口 却不知道webservice接口是怎么实现的 这一次 我们来一探究竟 这里吐槽一句 都什么年代
  • 6.Android学习之Android事件处理和手势(一)

    目录 6 Android事件处理和手势 一 1 事件处理概述 1 1 基于监听的事件处理 1 2 基于回调的事件处理 2 物理按键事件处理 3 触摸屏事件处理 3 1 单击事件 3 2 长按事件 3 3 触摸事件 6 Android事件处理