Android 手势操作GestureDetector
在很多应用中我们经常会看到一些不同手势的点击事件,例如QQ的消息列表,我们可以通过左滑消息来选择删除或者置顶或者标记为已读,我们也可以通过右滑拖出QQ菜单。有些应用中还会有长按,双击等手势。但是一般情况下,这些操作的手势都不是很复杂,不会出现什么右击左击,或者三连击这样的手势。因为开发应用的原则就是简单化,让别人可以一看就懂,一看就会。
今天我们就来学习一下Android中手势的操作。在Android中手势的操作使用GestureDetector这个类。
GestureDetector概述
Detects various gestures and events using the supplied MotionEvents. The GestureDetector.OnGestureListener callback will notify users when a particular motion event has occurred. This class should only be used with MotionEvents reported via touch (don’t use for trackball events).
GestureDetector通过MotionEvent类检测不同的手势和事件。在MotionEvent有很多基础的动作监测:ACTION_CANCEL(动作取消), ACTION_DOWN(按下), ACTION_MOVE(移动),ACTION_UP(抬起)等,而手势的操作就是以MotionEvent中这些基本的动作为基础的,通过将这些基本的动作组合从而形成手势。在GestureDetector中有一个GestureDetector.OnGestureListener监听类,这个类都是当手势发生时调用的。
要使用GestureDetector类,我们首先要创建它的对象,我们先来看他的构造器:
注意:GestureDetector(GestureDetector.OnGestureListener listener, Handler handler)和GestureDetector(GestureDetector.OnGestureListener listener)在API level 3以后已经取代,这里不再列出。
- GestureDetector(Context context, GestureDetector.OnGestureListener listener)
传入两个参数,一个是Context的对象,一个是GestureDetector.OnGestureListener的对象。上面已经讲过GestureDetector.OnGestureListener是什么。 - GestureDetector(Context context, GestureDetector.OnGestureListener listener, Handler handler)
前两个不用说了,第三个我查了一下API,原文是这样:”the handler to use for running deferred listener events.”,意思应该是当运行延时的监听对象时使用这个Handler对象。 - GestureDetector(Context context, GestureDetector.OnGestureListener listener, Handler handler, boolean unused)
前三个不用说了吧,最后一个是定义当前有没有被使用。
一般情况下我们都是使用第一个构造器。
GestureDetector中的方法不是很多,有两个是非常重要的,我们这里拿出来说一说,其他的看名字就了解如何使用了: - onGenericMotionEvent(MotionEvent ev)
当我们的手势动作是由GenericMotionEvent动作构成时,我们需要调用这个方法,这样我们定义的手势才可用。 onTouchEvent(MotionEvent ev)
当我们的手势是由MotionEvent 构成时,我们需要调用这个方法,手势才能生效。我们下面来看一下GestureDetector手势是如何定义的?
GestureDetector.SimpleOnGestureListener
创建手势,首先要创建一个GestureDetector对象。创建GestureDetector对象时要传入一个GestureDetector.OnGestureListener对象,所以我们要创建一个GestureDetector.OnGestureListener对象,但是GestureDetector.OnGestureListener是一个interface接口,有人可能会想我们可以创建一个GestureDetector.OnGestureListener的匿名内部类啊,这样是可以,但是要实现GestureDetector.OnGestureListener中的好多方法,这样会使我们代码冗长复杂。API中给我们提供了一个解决的方法,就是通过使用GestureDetector.SimpleOnGestureListener类。
我们看API中对他的描述:A convenience class to extend when you only want to listen for a subset of all the gestures. This implements all methods in the GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener, and GestureDetector.OnContextClickListener but does nothing and return false for all applicable methods.
大体意思是这样的:我们可以通过使用这个类来监听一系列的手势操作,也就是我们可以使用这二个监听器监听多个手势,这个类继承了: GestureDetector.OnGestureListener(手势监听器), GestureDetector.OnDoubleTapListener(双击监听器), and GestureDetector.OnContextClickListener(上下文点击监听器)中的所有方法。
我们来看一下他的方法:
onContextClick(MotionEvent e):上下文点击手势。
onDoubleTap(MotionEvent e):双击手势。
onDoubleTapEvent(MotionEvent e):双击按下和抬起分别产生点击事件手势。
onDown(MotionEvent e):单击手势。
onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手势,这个要与onScroll区别:onFling是滑动后,事件响应;onScroll是手指滑动时,控件也跟着滑动,同时响应。
onLongPress(MotionEvent e):长按手势。
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):拖动手势。
onShowPress(MotionEvent e):按下时响应事件。
onSingleTapConfirmed(MotionEvent e):单击手势。
onSingleTapUp(MotionEvent e):也是单击手势,是单击抬起后响应时间。
手势定义
前面基础差不多都打好了,下面我们来使用下。这里只练习:双击,滑动和拖动的手势操作。
手势定义 ###
定义一个MyButton类继承Button控件。
public class MyButton extends Button {private GestureDetector mGestureDetector;//定义手势对象//自定义View的构造器public MyButton(Context context) {super(context);}public MyButton(Context context, AttributeSet attrs) {super(context, attrs);//初始化GestureDetector对象,传入GestureDetector.SimpleOnGestureListener对象,监听多个手势。mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {//监听双击手势@Overridepublic boolean onDoubleTap(MotionEvent e) { Log.d("data", "点击了两次按钮! ");return true;}//监听滑动手势@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {if (Math.abs(e2.getX() - e1.getX()) > 0) {//设置控件滑动的动画ObjectAnimator.ofFloat(MyButton.this, "translationX", getTranslationX(), getTranslationX() + (e2.getX() - e1.getX())).setDuration(500).start();return true;}return super.onFling(e1, e2, velocityX, velocityY);}//监听拖动的手势@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//设置控件跟随手势移动setTranslationY(getTranslationY() + e2.getY() - e1.getY());setTranslationX(getTranslationX() + e2.getX() - e1.getX());return true;}});}@Overridepublic boolean onTouchEvent(MotionEvent event) {//调用此方法,实现手势的监听使用。mGestureDetector.onTouchEvent(event);return super.onTouchEvent(event);}
}
注意:复制代码使用时,onFling方法和onScroll方法不要同时使用,因为效果近似,可能会看不出效果来。使用onFling手势将onScroll方法屏蔽掉,使用onScroll手势时同理。
双击手势:
滑动手势:
拖动手势:
Activity中响应手势事件
如果我们想在Activity中使用双击,滑动,拖动的点击事件,我们需要在MyButton中定义一个点击事件。这里我们以双击为例,在MyButton中添加如下代码:(这里使用到了自定义View中的自定义点击事件知识点,不懂的可以查看《Android 自定义View——自定义点击事件 》这篇博客。)
//这里其实是使用的自定义View的点击事件public OnDoubleClickListerner onDoubleClickListerner;//定义双击的监听接口对象//设置获得双击的监听接口对象的set方法。public void setOnDoubleClickListerner(OnDoubleClickListerner onDoubleClickListerner) {this.onDoubleClickListerner = onDoubleClickListerner;}//创建双击的监听接口interface OnDoubleClickListerner {void onDoubleClick(View view);}
在双击手势中添加:
//监听双击手势@Overridepublic boolean onDoubleTap(MotionEvent e) {if (onDoubleClickListerner != null) {onDoubleClickListerner.onDoubleClick(MyButton.this);}Log.d("data", "点击了两次按钮! ");return true;}
这样我们就可以在Activity中使用了:
public class MainActivity extends AppCompatActivity {private MyButton button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (MyButton) findViewById(R.id.button);button.setOnDoubleClickListerner(new MyButton.OnDoubleClickListerner() {@Overridepublic void onDoubleClick(View view) {Log.d("data", "点击了两次按钮! ");//次此处添加处理代码}});}
}
Android 手势操作GestureDetector相关推荐
- Android 触摸及手势操作GestureDetector
现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘.无鼠标的手机系统带来了很多的便利.当用户触摸屏幕时会产生很多的触摸事件,down.up.move等等. ...
- Android手势操作
手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理首先,在Android系统中, ...
- Android手势操作耍起来!
目录 前言 初步了解手势操作 六个重写方法 小栗子体验一下 别忘了双击事件 最后 前言 手势操作是Android交互当中至关重要的. 可以说, 如果一个软件没有好的手势操作, 就不能将其定义为移动端的 ...
- 关于Android手势检测GestureDetector的应用笔记
关于Android手势检测 代码参照Android 手势检测 OnDown(MotionEvent e) 用户按下屏幕就会触发: onFling(MotionEvent e1, MotionEvent ...
- android手势操作滑动效果触摸屏事件处理
2019独角兽企业重金招聘Python工程师标准>>> 很多时候,利用触摸屏的Fling.Scroll等Gesture(手势)操作来操作会使得应用程序的用户体验大大提升,比如用Scr ...
- android 手势操作垂直滑动,Android-水平和垂直方向都可滑动的RecycleView
最近有点忙,项目进度跟的比较紧.最近需求那边让我们写一个左右和上下都可滑动的列表,用来展示多个Title的值.这里我把需求简化了一下.老规矩,先看图. 在看到需求的时候,有在网上看看有没有别人造好的轮 ...
- android view gesturedetector,如何在Android中利用 GestureDetector进行手势检测
如何在Android中利用 GestureDetector进行手势检测 发布时间:2020-11-26 16:15:21 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关如何在Andro ...
- android touch事件坐标原点,Android onTouch事件与手势操作
触摸,手势操作已经很好的融入了我们的生活.那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习. 先看效果图 如上 ...
- Android之GestureDetector-简单手势操作及通过手势缩放图片,我离职后面试收割小米等大厂offer
Android提供了手势检测,并为其提供了相应的监听器,需要用到的类是GestureDetector,其实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDete ...
最新文章
- 首颗“机器心”成功植入近四十年后,人造心脏终于又迎来颠覆变革
- STC单片机功率控制下载板
- deno学习一 安装试用几个问题解决
- 2022 年营销自动化七大趋势前瞻
- 控件必须放在具有 runat=server 的窗体标记内错误的解决方法
- mac建立sftp连接_【5分钟玩转Lighthouse】Win10远程连接同步代码
- oracle禁用ctss,CTSS服务介绍及模式调整
- java 正则表达式 判断 日期_怎么在java中利用正则表达式对时间日期进行判断
- Ubuntu 16.04 源添加
- 普通话-汉语拼音字母表
- 大数据时代:九个大数据应用领域
- 托业考试简述 — 托业考试题型、托业考试结构、托业考试考场时间、托业考试学习策略
- python父亲节礼物送什么_父亲节送什么礼物好
- docker Hub-Node模式运行selenium grid4,经常遇到用例运行到60%-65%时无法继续运行
- C语言实现SM3(基于GMSSL)
- ES20-JAVA API 词项搜索
- mmse评估量表_简易精神状态评价量表(MMSE量表)
- linux mysql 测试工具_LINUX系统下MySQL 压力测试工具super smack
- dts、dws文件介绍
- 单片机快速入门:12864液晶屏实现多功能数字时钟
热门文章
- 百度AI开放平台人体分析_人像分割的Python示例代码
- 一碗猪油————————特别鲜香的猪油什锦炒饭
- 考研英语近义词与反义词·十一
- 【KV260】K26 SOM烧写脚本
- 发展科技到底有什么用,转NASA专家给一位修女的一封信
- 7723java版_刺马_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
- iphone11系列的尺寸_还有必要吗?iPhone 11系列终于要全家族支持双卡双待了
- 学好数据库,看这9本书就够了
- ringbuffer的特别之处
- 移相信号发生器 课程设计 电赛 正弦波发生 相位调节