触屏fling/scroll/drag的区别及其详细过程

2023-10-27

Google了一下,终于搞清了touch screen下的几种操作模式(对应的是事件)。

对于一个view, 常用的操作有点击(click)和长按(long press)二种。实际上,这些操作类型是Android内部在onTouchEvent(MotionEvent event)里对用户的动作做了一定的分析,从而通知应用程序是发生了点击还是长按等事件。

有时,我们需要的并不仅限于这两种操作。我们可以借助 GestureDetector来分析出更细致的操作类型。 基本的过程就是创建一个myGestureDetector对象,传入自己定义的my OnGestureListener 对象,在自己的onTouchEvent回调函数中将 接收到的event传给myGestureDetector进行分析, my OnGestureListener 会回调我们定义的动作。
【 从 GestureDetector.SimpleOnGestureListener派生出
myListener 会更简单,因为这个类已经实现了全部接口,只是没有什么实际有用的功能。】

参考以下代码(for an Activity):

// -------------------------------------------------------------------------------

private GestureDetector mGestureDetector;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    mGestureDetector = new GestureDetector(this, new MyGestureListener());
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}


class MyGestureListener extends GestureDetector.OnGestureListener{ //共有6个方法:

    // 用户轻触触屏:Touch down
(仅一次)时触发, e为down时的MotionEvent:
    boolean onDown(MotionEvent e){return true;}

    //
  用户轻触触屏,且尚未松开或拖动
    //  
 在Touch down
(仅一次)之后一定时间(115ms)触发,e为down时的MotionEvent:
    void onShowPress(MotionEvent e){return true;}

    //
  用户(轻触触屏后)松开:Touch up (仅一次)时触发,e为up时的MotionEvent:
    boolean onSingleTapUp(MotionEvent e){return true;}

    //
  用户轻触触屏,并拖动:
    //   按下并滑动时触发,e1为down
(仅一次)时的MotionEvent,e2为move(多个)时的MotionEvent:
    boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){return true;}

    // 用户长按触屏(此View必须是可长按的: myView->setLongClickable(true);):
    //   在Touch down之后一定时间(500ms)后,由多个down事件触发,e为down时的MotionEvent:
    void onLongPress(MotionEvent e){return true;}

    // 用户按下触屏、快速移动后松开:
    //   
按下并快速滑动一小段距离(多个move),up时触发,e1为down (仅一次)时的MotionEvent,
    //   e2为up
(仅一次)时的MotionEvent:
    boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){return true;}
}
// -------------------------------------------------------------------------------

至于doubletap的检测,可以通过设置 mGestureDetector的OnDoubleTapListener来实现:

GestureDetector.OnDoubleTapListener doubleTapListener = new GestureDetector.OnDoubleTapListener() {

    // 完成一次单击,并确定(300ms内)没有发生第二次单击事件后触发,e为down时的MotionEvent:
    boolean onSingleTapConfirmed(MotionEvent e){return true;}
 
    // 第二次单击down时触发,e为第一次down时的MotionEvent:
    boolean onDoubleTap(MotionEvent e){return true;}

    // 第二次单击down、move和up时都触发,e为不同时机下的MotionEvent:
    boolean onDoubleTapEvent(MotionEvent e){return true;}
}
mGestureDetector.setDoubleTapListener(doubleTapListener);
// -------------------------------------------------------------------------------


具体地说,典型的触屏事件及其listener执行的流程见下:

1). 单击事件的执行流程:
  有两种情况,一种是时间很短,一种时间稍长。
  时间很短:onDown ----> onSingleTapUp
  ----> onSingleTapConfirmed
  时间稍长:onDown ----> onShowPress  
  ----> onSingleTapUp  ----> onSingleTapConfirmed

2). 长按事件
   onDown ----> onShowPress ----> onLongPress

3.抛(fling):手指触动屏幕后,稍微滑动后立即松开:
   onDown
 ----> onScroll ----> onScroll ----> onScroll ----> ………  ----> onFling

4.拖动(drag)
   onDown
 ----> onScroll ----> onScroll ----> onFiling
   注意:有的时候会触发onFiling,但是有的时候不会触发,z这是因为人的动作不标准所致。

<完>

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

触屏fling/scroll/drag的区别及其详细过程 的相关文章

  • 在Android中将半径边框绘制到imageview或textview的一个角落

    我需要在我的应用程序中为图像视图或文本视图绘制边框 但我只需要在一个角落绘制它 就像图像一样 我做了一个形状 但我在所有 4 个边上都有边框
  • Android Ble GATT_ERROR 133 经常使用三星设备

    我正在研究 BLE 应用程序 我已经使用 Nexus Moto Samsung LG 等不同设备进行了测试 我仅在三星设备中收到 GATT 错误 133 三星 A5 2016 尝试连接 10 次 但只连接了 2 或 3 次 请帮助我 Non
  • 如何使用gradle这样的格式更改apk名称?

    当我使用 gradle 构建应用程序时 我想将 app release apk 文件名更改为如下所示 format appname of package name V version code yyMMdd R T explain appn
  • 居中复选框视图

    如果除了 或代替 复选框之外 您还对单选按钮感兴趣 请参阅this https stackoverflow com questions 16701806 centering views 2而是提问 尽管存在
  • 删除 json 对象字符串中的“\”

    如何删除下面字符串中的特殊字符 String x message content toom recipients id 1000001865 room subject room 我使用了 x replaceAll 但它不起作用 您必须转义正
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • 通过我的应用程序以编程方式插入新联系人,而不使用 Intent

    我正在使用一个应用程序 与手机联系人进行交互 我想将新联系人添加到我的手机联系人列表中 我已经尝试过以下代码 但它不起作用 void addContact Context ctx PreviewContactModel model Arra
  • 如何更改对话框的默认黑色暗淡背景“颜色”(而不是暗淡量)?

    这是随机显示的图像Dialog在网上找到的 我一直在实施一个自定义Dialog 我可以处理对话框上的几乎所有内容 除了对话框本身下方的默认黑色昏暗背景之外 但在其后面的整个屏幕上 基本上我想改变它color和阿尔法值 我一直在 StackO
  • AOSP 中 android.Build.SERIAL 何时何地生成?

    我知道android Build SERIAL是在第一次设备启动时生成的 但我无法准确定位位置和时间 我正在建造AOSP Jelly Bean Android平板电脑 nosdcard 第二个问题 这个是序列号吗 really对所有人来说都
  • 仅在 Android 应用程序中使用 XHDPI 可绘制对象?

    如果您计划在不久的将来支持 LDPI MDPI HPDI 或许还有 XHDPI 那么是否可以在项目中仅包含 XHDPI 可绘制对象并让设备将其缩放到所需的分辨率 我已经测试过在 Photoshop 中将可绘制对象的大小调整为 MDPI 和
  • 如何将 Google Now 搜索栏添加到我的应用程序中?

    谷歌刚刚将其搜索栏从 Google Now 引入到了 Play 商店应用程序中 如下面的 gif 所示 如何将这个操作栏搜索栏实现到我自己的应用程序中 我想要 style 汉堡动画 从工具栏按钮访问 麦克风按钮 对棒棒糖设备的连锁反应 我已
  • Flutter Spotify Api 身份验证

    我需要在使用 Spotify api 的 Flutter 应用程序中对用户进行身份验证 我使用 flutter web auth 打开 WebView 并让用户在那里登录 我无法返回应用程序 在 Spotify 仪表板中 我将回调 Uri
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • 如何在虚拟机 VirtualBox 上运行 Android-x86 4.2 iso?

    我想用Android x86测试和调试我的应用程序 我之前成功尝试过其他版本的Android x86 但是关于android x86 4 2有一个错误 所以我在这里问我的问题 因为它可能会发生在其他人身上 我安装了oracle VM vir
  • Android 26 (O) 通知不显示操作图标 [重复]

    这个问题在这里已经有答案了 随着 Android 26 O 引入通知渠道 我一直在调查 Google 提供的com example android notificationchannels 这个示例按预期工作 直到我尝试添加Action到示
  • popupBackground 与 Material Design 相关的问题

    我一直致力于将我的应用程序更新为 Material Design 我有一个使用选项卡的应用程序 由于某种原因 每当我使用 android popupBackground 设置下拉菜单颜色时 它就会崩溃 我设置了一个带有选项卡的默认项目并使用
  • Android - 正确使用 invalidateOptionsMenu()

    我一直在寻找很多invalidateOptionsMenu 我知道它的作用 但我想不出这种方法在现实生活中有用的任何例子 我的意思是 例如 假设我们要添加一个新的MenuItem to our ActionBar 我们可以简单地获取菜单on
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 使用 Glide 库设置图像加载完成后进度条的可见性

    您好 我想要一个图像进度条 该进度条将在图像加载时显示 但当图像加载完成时 我想将其设置为消失 早些时候我为此使用了毕加索库 但我不知道如何将它与 Glide 库一起使用 我知道有一些资源就绪功能 但我不知道如何使用它 谁能帮我 毕加索图书
  • 使用 AndroidX ExifInterface 从图像中检索 GPS EXIF 数据?

    我的目标是 Android 13 并使用新的照片选择器 https developer android com training data storage shared photopicker检索图像 例如 val photoPicker

随机推荐

  • [MySql]基本知识及表的创建

    目录 1 数据库的操作 2 常用的数据类型 2 1数值类型 2 2字符串类型 2 3日期类型 3 表的操作 4 使用示例 1 数据库的操作 show databases 显示当前数据库 create database database na
  • linux服务器安装mysql步骤详解

    还是按照菜鸟教程上的顺序进行安装 踩的坑还是比较少的 MySQL 安装 菜鸟教程 1 安装前 我们可以检测系统是否自带安装 MySQL rpm qa grep mysql 2 如果你系统有安装 那可以选择进行卸载 rpm e mysql 普
  • ModBus协议部分功能码设计与实现方法(QT环境)

    写在前面 资源 QT环境下实现资源 1 调研 1 1 什么是Modbus Modbus由MODICON公司于1979年开发 是一种工业现场总线协议标准 1996年施耐德公司推出基于以太网TCP IP的Modbus协议 ModbusTCP M
  • (9)目标检测_SSD的原理

    0主要参考原理来源 1 SSD 论文 代码 pytorch zonechen 博客园 2 python ssd目标检测 目标检测之SSD算法实现 Pytorch weixin 39805734的博客 CSDN博客 3 2 1SSD算法理论
  • Python教程:Python3.8了解差不多了,Python3.9新特性了解一下

    本期Python教程将解释 Python 3 9 中的新特性 而不是 3 8 官网目前也只有 3 8 的下载包 3 9 需要自己编译 Cpython 语言上的变化 1 使用 Python 进行相对导包的时候 import 出现异常时类型由原
  • 启动失败 Failed to determine a suitable driver class 问题解决方案

    1 问题描述 启动报错 Description Failed to configure a DataSource url attribute is not specified and no embedded datasource could
  • GFS故障解决

    一 问题描述 之前 两台数据库服务器安装了两个实例 共享磁盘阵列 通过ASM管理 日志文件和控制文件等 通过GFS实现共享存储文件同步 系统工作正常 某天加入第三个节点时失败 集群正常使用就没再管它 某日 数据库异常 重启操作系统后 GFS
  • Spring Boot整合Mybatis-Plus快速入门(二)

    之前快速搭建项目中 创建的类名与表名以及属性名都是一致的 所以mybatis plus可以根据类名以及属性名进行对应的操作 那么如果表名与属性名中不一致或属性名与列名不一致时我们应该怎么处理呢 这里mybatis plus为我们提供了很多注
  • 解决VMware14打开虚拟机黑屏问题

    最近把VMware升级到14 0之后 运行虚拟机之后无法显示图像 屏幕一团黑 但点击显示缩略图的时候是可以看到系统已经启动并在正常运行的 可以通过以下方法解决 以管理员身份打开命令提示符 输入命令 netsh winsock reset 重
  • 知识图谱(七)——事件抽取

    文章目录 一 任务概述 1 事件的定义 2 事件抽取的定义 3 相关评测和语料资源 二 限定域事件抽取 1 基于模式匹配的事件抽取方法 1 有监督的事件模式匹配 2 弱监督的事件模式匹配 3 优缺点 2 基于机器学习的事件抽取方法 1 有监
  • arm-none-eabi-gcc编译、链接选项详解

    1 mthumb 和 mthumb interwork mthumb 的意义是 使用这个编译选项生成的目标文件是Thumb指令的 目前还没有发现GNU编译器中有哪一个选项可以指定生成的目标文件是thumb 2的 相对应的 marm 的意义是
  • 多态,虚函数,纯虚函数

    多态 借助虚函数 基类指针既可以使用基类 父类 的成员函数 也可以使用派生类 子类 的成员函数 它有多种形态 或多种表现方式 这就是多态 简单说就是同一条语句可以执行不同的操作 看起来有不同表现方式 这就是多态 构成多态的条件 多态存在的三
  • .net 平台下的数学库math.net(一)

    Math NET的目标是为提供一款自身包含清晰框架的符号运算和数学运算 科学运算 它是C 开发的开源类库 Math NET含了一个支持线性代数的解析器 分析复杂微分 解方程等等功能 这个项目大部分采用的是MIT X11开源软件协议 目前该组
  • ConstraintLayout实用特性

    转载自赵彦军的博客 前言 在2016年的Google I O大会上 Google 发布了Android Studio 2 2预览版 同时也发布了Android 新的布局方案 ConstraintLayout 但是最近的一年也没有大规模的使用
  • 【ABviewer从零开始教学查看器篇②】关于打开文件的快捷方式

    ABViewer是一款高质量 高效率 低成本的多功能设计及工程文档管理工具 能为您提供全面的专业的浏览及编辑功能 同时支持30多种光栅和矢量图形格式 在小编看来 ABViewer是一款非常简单且实用的CAD文档查看与编辑器 对于使用小白可能
  • 判断是否是数组

    整理了一些 留待自己复习用 1 instanceof var a name fangxiaoming age 19 var b 1 2 3 4 console log a instanceof Array false console log
  • 【翻译】我们建立了一个.NET操作员SDK(所以您不必这样做)。

    我们用C 语言构建了一个 NET操作者SDK 因此您可以用C 或任何 NET语言构建自己的Kubernetes操作者 当然也 有Go Operator SDK 还有我们的Java Operator SDK 那么为什么不为 NET社区提供一些
  • 用 Visual Studio 2019 编译 FFmpeg 简单教程

    需要的东西 Visual Studio 2019 这个自行解决吧 本人用的是社区版 MSYS 环境 去 https www msys2 org 下载 本人下载的是 msys2 x86 64 20210725 exe yasm exe 去 h
  • Security in IP-Based IoT Node and Device Authentication

    Abstract The IoT security aims for enabling IoT data protection in various interconnected nodes These frameworks require
  • 触屏fling/scroll/drag的区别及其详细过程

    原文地址 Android 触屏fling scroll drag的区别及其详细过程 作者 飘锦丹枫 Google了一下 终于搞清了touch screen下的几种操作模式 对应的是事件 对于一个view 常用的操作有点击 click 和长按