Android开发:在onTouchEvent中处理任意时间的长按事件
Android提供了GestureDetector类来处理一些常用的手势操作,比如说 onLongPress,onFling 等。但这里不使用GestureDetector,而是直接在自定义View重写的onTouchEvent中进行处理。
欲实现的效果是:当手机按住屏幕时,如果在指定的时间内没有移动(如500毫秒),那么进入长按模式,此时手指在屏幕上移动都算作长按模式。如果手机按住屏幕就立马移动,那么就算作移动模式。
MotionEvent 类提供了记录当前坐标的函数(getX(),getY())和当前事件产生的时间的函数(getEventTime())以及按下时间(getDowntime())。MotionEvent同时也提供了当前的操作类型,按下(ACTION_DOWN)、 移动 (ACTION_MOVE)、弹起 (ACTION_UP)。有了这些参数,我们便可以轻易的实现想要的效果了。
大概思路如下:在按下时记录x,y坐标以及按下时间,当第一次移动的时候获取移动的时间,如果大于指定的长按时间,那么进入长按模式,否则就是普通的移动模式。很容易,在模拟器里面实现了这个效果,但是当在真机里面运行时,却无法实现这样的效果。原来模拟器点击的时候能够保证在不移动鼠标的情况下不触发ACTION_MOVE,但是真机却很敏感,几乎在ACTION_DOWN后的几毫秒之后就立马不停的ACTION_MOVE了。想了一下,其实只要稍微变通下变可以在真机上也实现相同的效果了。那就是判断ACTION_MOVE后的坐标和ACTION_DOWN的坐标的偏移值是否小于我们指定的偏移像素,如果在指定值内,那么认为没有移动。于是有了如下这个函数。
- /**
- * * 判断是否有长按动作发生 * @param lastX 按下时X坐标 * @param lastY 按下时Y坐标 *
- *
- * @param thisX
- * 移动时X坐标 *
- * @param thisY
- * 移动时Y坐标 *
- * @param lastDownTime
- * 按下时间 *
- * @param thisEventTime
- * 移动时间 *
- * @param longPressTime
- * 判断长按时间的阀值
- */
- static boolean isLongPressed(float lastX, float lastY, float thisX,
- float thisY, long lastDownTime, long thisEventTime,
- long longPressTime) {
- float offsetX = Math.abs(thisX - lastX);
- float offsetY = Math.abs(thisY - lastY);
- long intervalTime = thisEventTime - lastDownTime;
- if (offsetX <= 10 && offsetY <= 10 && intervalTime >= longPressTime) {
- return true;
- }
- return false;
- }
在ACTION_DOWN的时候,记录下lastX,lastY和lastDownTime,在ACTION_MOVE的时候判断当前是否为长按模式(类标志变量的方式),如果不是,那么获取当前的thisX,thisY和thisEventTime调用函数进行判断。最后别忘记在ACTION_UP里将长按标志值为FALSE。ACTION_DOWN里面这样处理:
- //检测是否长按,在非长按时检测
- if(!mIsLongPressed){
- mIsLongPressed = isLongPressed(mLastMotionX, mLastMotionY, x, y, lastDownTime,eventTime,500);
- }
- if(mIsLongPressed){
- //长按模式所做的事
- }else{
- //移动模式所做的事
- }
- }
Android开发:在onTouchEvent中处理任意时间的长按事件的更多相关文章
- Android开发——异步任务中Activity销毁时的问题
0. 前言 在Android开发中经常会发生Activity的销毁重建,比如用户长时间接听一个电话后回到APP.在Android开发--Fragment知识整理(二)中我们提到了使用Fragment ...
- android开发在adapter中使用反射添加元素
android开发中最常用的控件之一就是listview,伴随listview还要有adapter和放入适配器的item.然后假设其中有一部分item的生成符合一定规律,Item item = new ...
- Android开发:Eclipse中SqliteManager插件使用
通常开发Android的时候要使用到数据库操作,会遇到下面小问题: 数据库文件在哪?怎样訪问或操作? 能够通过:打开DDMS->File Explorer看到的sqlite数据库在eclipse ...
- ArcGIS Runtime for Android开发教程V2.0(8)基础篇-----地图事件
转自:http://blog.csdn.net/arcgis_mobile/article/details/8263283 ArcGIS Runtime sdk for Android为我们提供了丰富 ...
- Android开发(24)---安卓中实现多线程下载(带进度条和百分比)
当我们学完java中多线程的下载后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java package com.example.downloads; import ...
- Android 开发权限设置中英对照说明详解
android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传( Al ...
- Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器
前言 在Android里获取视频的信息主要依靠MediaMetadataRetriever实现 获取最佳视频预览图 所谓的最佳就是MediaMetadataRetriever自己计算的 /** * 获 ...
- Android开发-解决 AIDL 中找不到couldn't find import for class错误
最近在使用AIDL做IPC的时候,在处理复杂的数据类型的时候,编译器总是报couldn't find import for class错误,所以在这里总结下AIDL使用的时候的一些注意事项,希望对你能 ...
- Android开发 解决AlertDialog中的EditText无法调出输入法的问题
在AlertDialog中使用自定义的View,如果View中有EditText,在上面点击,默认是跳不出软键盘的,不是焦点的问题.解决方法,有两种,一是把AlertDialog换成Dialog,但这 ...
随机推荐
- 使用Qt设计师文件的3种方式
使用Qt设计师设计的.ui界面文件是XML文件,有3种方式在PyQt中使用,本文将通过实例进行讲解. 使用PyQt中如何结合Qt设计师进行开发中的例子.点击按钮修改标签的内容. 1. 直接使用ui文件 ...
- ios7禁止默认划动返回
self.navigationController.interactivePopGestureRecognizer.enabled = NO; 或 在使用之前先要判断是否ios7,不然会导致crash ...
- 基于Sql Server 2008的分布式数据库的实践(三)
原文 基于Sql Server 2008的分布式数据库的实践(三) 配置PHP 1.打开PHP配置文件,找到extension=php_mssql.dll,将前面的注释符号去掉 2.找到mssql.s ...
- php抓取ajax页面返回图片。
要抓取的页面:http://pic.hao123.com/ 当我们往下滚动的时候,图片是用ajax来动态获取的.这就需要我们仔细分析页面了. 可以看到,异步加载的ajax文件为: http://pic ...
- JAVAC 命令使用方法
结构 javac [ options ] [ sourcefiles ] [ @files ] 參数可按随意次序排列. options 命令行选项. sourcefiles 一个或多个要编译的源文件( ...
- JVM--常见的虚拟机回收算法
Serial GC -XX:+UseSerialGC 这样就设置为了串行GC回收方式,这种方式在Client模式下是默认的. 一般是使用在单机程序,小内存,CPU个数少的机器上. 没有复杂的算法,只用 ...
- HDOJ 1272 并查集 不相同父节点
判断两点:1.任何2点的父节点不能相同->否则会导致2点间有多条通路2.所有点只有1个集合 存在一个小坑,就是第一次输入 0 0 的时候,应该输出 Yes , 否则会WA MY AC Code ...
- QtSoap调用Web Service(QtSoap是非官方应用)
今天学习如何用QtSoap访问Web Service服务.这里调用的是查询QQ在线状态的服务qqOnlineWebService.调用的几个步骤: 1.创建QtSoapMessage对象 messag ...
- Android GsonUtils工具类
有那么一个开源jar包,叫gson 可以很方便的将java中的对象和字符串相互转化,数据传输和处理的时候,用到的可能性很大 https://github.com/google/gson http:// ...
- MySQL如何查询LINESTRING数据
我有一个提交的命名crm_geo_org,具有以下结构 ipoid INTEGER 11 NOT NULL PRIMARY KEY beginip INTEGER 14 NOT NULL UNSIGN ...