在很多应用中我们经常会看到一些不同手势的点击事件,例如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相关推荐

  1. Android 触摸及手势操作GestureDetector

    现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘.无鼠标的手机系统带来了很多的便利.当用户触摸屏幕时会产生很多的触摸事件,down.up.move等等. ...

  2. Android手势操作

    手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理首先,在Android系统中, ...

  3. Android手势操作耍起来!

    目录 前言 初步了解手势操作 六个重写方法 小栗子体验一下 别忘了双击事件 最后 前言 手势操作是Android交互当中至关重要的. 可以说, 如果一个软件没有好的手势操作, 就不能将其定义为移动端的 ...

  4. 关于Android手势检测GestureDetector的应用笔记

    关于Android手势检测 代码参照Android 手势检测 OnDown(MotionEvent e) 用户按下屏幕就会触发: onFling(MotionEvent e1, MotionEvent ...

  5. android手势操作滑动效果触摸屏事件处理

    2019独角兽企业重金招聘Python工程师标准>>> 很多时候,利用触摸屏的Fling.Scroll等Gesture(手势)操作来操作会使得应用程序的用户体验大大提升,比如用Scr ...

  6. android 手势操作垂直滑动,Android-水平和垂直方向都可滑动的RecycleView

    最近有点忙,项目进度跟的比较紧.最近需求那边让我们写一个左右和上下都可滑动的列表,用来展示多个Title的值.这里我把需求简化了一下.老规矩,先看图. 在看到需求的时候,有在网上看看有没有别人造好的轮 ...

  7. android view gesturedetector,如何在Android中利用 GestureDetector进行手势检测

    如何在Android中利用 GestureDetector进行手势检测 发布时间:2020-11-26 16:15:21 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关如何在Andro ...

  8. android touch事件坐标原点,Android onTouch事件与手势操作

    触摸,手势操作已经很好的融入了我们的生活.那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习. 先看效果图 如上 ...

  9. Android之GestureDetector-简单手势操作及通过手势缩放图片,我离职后面试收割小米等大厂offer

    Android提供了手势检测,并为其提供了相应的监听器,需要用到的类是GestureDetector,其实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDete ...

最新文章

  1. 首颗“机器心”成功植入近四十年后,人造心脏终于又迎来颠覆变革
  2. STC单片机功率控制下载板
  3. deno学习一 安装试用几个问题解决
  4. 2022 年营销自动化七大趋势前瞻
  5. 控件必须放在具有 runat=server 的窗体标记内错误的解决方法
  6. mac建立sftp连接_【5分钟玩转Lighthouse】Win10远程连接同步代码
  7. oracle禁用ctss,CTSS服务介绍及模式调整
  8. java 正则表达式 判断 日期_怎么在java中利用正则表达式对时间日期进行判断
  9. Ubuntu 16.04 源添加
  10. 普通话-汉语拼音字母表
  11. 大数据时代:九个大数据应用领域
  12. 托业考试简述 — 托业考试题型、托业考试结构、托业考试考场时间、托业考试学习策略
  13. python父亲节礼物送什么_父亲节送什么礼物好
  14. docker Hub-Node模式运行selenium grid4,经常遇到用例运行到60%-65%时无法继续运行
  15. C语言实现SM3(基于GMSSL)
  16. ES20-JAVA API 词项搜索
  17. mmse评估量表_简易精神状态评价量表(MMSE量表)
  18. linux mysql 测试工具_LINUX系统下MySQL 压力测试工具super smack
  19. dts、dws文件介绍
  20. 单片机快速入门:12864液晶屏实现多功能数字时钟

热门文章

  1. 百度AI开放平台人体分析_人像分割的Python示例代码
  2. 一碗猪油————————特别鲜香的猪油什锦炒饭
  3. 考研英语近义词与反义词·十一
  4. 【KV260】K26 SOM烧写脚本
  5. 发展科技到底有什么用,转NASA专家给一位修女的一封信
  6. 7723java版_刺马_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
  7. iphone11系列的尺寸_还有必要吗?iPhone 11系列终于要全家族支持双卡双待了
  8. 学好数据库,看这9本书就够了
  9. ringbuffer的特别之处
  10. 移相信号发生器 课程设计 电赛 正弦波发生 相位调节