Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android 触摸屏交互之手势监听

Android 触摸屏交互之手势监听

作者头像
晨曦_LLW
发布于 2020-09-25 05:29:53
发布于 2020-09-25 05:29:53
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

效果图

前言

2020年,智能手机大行其道,相信不会还有人用着老式的按键手机了吧,而智能手机最大的交互就是手机屏幕,其次的就是音量操作、生物识别(指纹+人脸+瞳孔)、说白了用的最多的是手机的屏幕,屏幕与用户之前进行交互,比如打开一个app你是不是要点击屏幕上某一个?有人说我可以用语音去打开,但是你没有想过语音其实只是帮你执行了点击,在手机上不管是玩游戏还是看电影或者是搞学习,都是要使用手机屏幕的,所以你知道屏幕交互有多么重要吗?

正文

屏幕的交互当然首先是触摸,说道触摸就是有一个手势监听,这个是Google起的名字,你不用手难道用脚吗?

下面可以新建一个项目,在MainActivity中实现两个监听

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GestureDetector.OnGestureListener//手势监听
GestureDetector.OnDoubleTapListener//双击监听

实现这两个监听之后,会创建好几个方法,这里我会一个一个说明 onDown

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
     * 当用户在屏幕上按下时会触发该方法,但在移动或抬起手指时不会触发
     * @param e
     * @return
     */
    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

onShowPress

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
     * 当用户在屏幕上按下,并且既没有移动有没有抬起手指时,会触发该方法。
     * 一般通过该方法告知用户他们的动作已经被识别到了,你可以 高亮某个元素来提醒他们
     * @param e
     */
    @Override
    public void onShowPress(MotionEvent e) {
     
    }

onSingleTapUp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
     * 当用户在屏幕上轻击时(通常是指点击屏幕的时间很短)会触发该方法
     * @param e
     * @return
     */
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

onScroll

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
     * 在屏幕上发起滚动的手势时会触发该方法
     * @param e1        第一个按下开始滚动的动作事件
     * @param e2        触发当前这个方法的移动动作的事件
     * @param distanceX 触发onScroll方法期间的X上的滚动距离
     * @param distanceY 触发onScroll方法期间的Y上的滚动距离
     * @return
     */
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

onLongPress

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
     * 记得设置detector.setIsLongpressEnabled(true);,否则长按不会触发
     * 当用户在屏幕上持续地长按时会触发该方法
     *
     * @param e
     */
    @Override
    public void onLongPress(MotionEvent e) {
    }

onFling

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 	/**
     * 当用户在屏幕上持续地按下并且有“抛”的动作时,会触发该方法。对于该事件的理解,
     * 你可以体会一下按住一个图标然后把它扔到某个地方的感觉。
     *
     * @param e1        第一个按下的动作事件
     * @param e2        触发当前这个方法的“猛扔”动作的事件
     * @param velocityX 触发onFling方法期间X轴上的移动速度
     * @param velocityY 触发onFling方法期间Y轴上的移动速度
     * @return
     */
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        return false;
    }

onSingleTapConfirmed

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
     * 当用户在屏幕上单击是会触发此方法,与上面的onSingleTapUp方法不同的地方在于,
     * 该方法只会在监听器确定了用户在第一次单击后不会触发双击事件时才会被触发。
     *
     * @param e
     * @return
     */
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        return true;
    }

onDoubleTap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 	/**
     * 当用户在屏幕上双击时会触发此方法。这里的按下动作事件指的时双击中的第一次触击。
     *
     * @param e
     * @return
     */
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        return false;
    }

onDoubleTapEvent

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
     * 在双击事件发生时会触发此方法,包括了按下、移动和抬起事件。
     *
     * @param e
     * @return
     */
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        return false;
    }

Android系统中,每一次手势交互都会依照以下顺序执行

  1. 接触接触屏一刹那,触发一个MotionEvent事件。
  2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象。
  3. 通过GestureDetector(手势识别器)转发次MotionEvent对象至OnGestureListener。
  4. OnGestureListener获得该对象,听根据该对象封装的的信息,做出合适的反馈。 在Android中,是由GestureDetector类来负责手势的检测,每一个GestureDetector类的实例都代表一个手势监听器。在创建手势监听器时需要一个类OnGestureListener例。 下面就来实践一下,为了使整个效果更直观,我修改了一下布局

activity_main.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimary"
        app:navigationIcon="@mipmap/icon_clear" />

    <LinearLayout
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="初学者-Study"
            android:textColor="#000"
            android:textSize="24sp" />
    </LinearLayout>


</LinearLayout>

里面用到了一个图标icon_clear.png

回到MainActivity

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	GestureDetector detector;//声明一个手势检测器对象
    private TextView tvResult, tvTest;
    Toolbar toolbar;
    String result = "";

然后在onCreate()中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		tvResult = findViewById(R.id.tv_result);
        toolbar = findViewById(R.id.toolbar);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                result = "初学者-Study";
                tvResult.setText(result);
                result = "";
            }
        });
        detector = new GestureDetector(this, this);//实例化这个手势检测器对象
        detector.setIsLongpressEnabled(true);//打开长触摸

然后就是具体的使用了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//绑定手势监听  这是前置条件
    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return detector.onTouchEvent(e);
    }

然后就可以在各个方法中进行数据的处理和显示了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/**
     * 当用户在屏幕上按下时会触发该方法,但在移动或抬起手指时不会触发
     *
     * @param e
     * @return
     */
    @Override
    public boolean onDown(MotionEvent e) {
        result += "onDown\n";
        tvResult.setText(result);
        return false;
    }

    /**
     * 当用户在屏幕上按下,并且既没有移动有没有抬起手指时,会触发该方法。
     * 一般通过该方法告知用户他们的动作已经被识别到了,你可以 高亮某个元素来提醒他们
     *
     * @param e
     */
    @Override
    public void onShowPress(MotionEvent e) {
        result += "onShowPress\n";
        tvResult.setText(result);
    }

    /**
     * 当用户在屏幕上轻击时(通常是指点击屏幕的时间很短)会触发该方法
     *
     * @param e
     * @return
     */
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        result += "onSingleTapUp\n";
        tvResult.setText(result);
        return false;
    }

    /**
     * 在屏幕上发起滚动的手势时会触发该方法
     *
     * @param e1        第一个按下开始滚动的动作事件
     * @param e2        触发当前这个方法的移动动作的事件
     * @param distanceX 触发onScroll方法期间的X上的滚动距离
     * @param distanceY 触发onScroll方法期间的Y上的滚动距离
     * @return
     */
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        if (distanceY >= 0) {//上滑
            result += "onScroll - Up\n";
            tvResult.setText(result);
        } else {//下滑
            result += "onScroll - Down\n";
            tvResult.setText(result);
        }
        return false;
    }

    /**
     * 记得设置detector.setIsLongpressEnabled(true);,否则长按不会触发
     * 当用户在屏幕上持续地长按时会触发该方法
     *
     * @param e
     */
    @Override
    public void onLongPress(MotionEvent e) {
        result += "onLongPress\n";
        tvResult.setText(result);
    }

    /**
     * 当用户在屏幕上持续地按下并且有“抛”的动作时,会触发该方法。对于该事件的理解,
     * 你可以体会一下按住一个图标然后把它扔到某个地方的感觉。
     *
     * @param e1        第一个按下的动作事件
     * @param e2        触发当前这个方法的“猛扔”动作的事件
     * @param velocityX 触发onFling方法期间X轴上的移动速度
     * @param velocityY 触发onFling方法期间Y轴上的移动速度
     * @return
     */
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        result += "onFling\n";
        tvResult.setText(result);
        return false;
    }


    /**
     * 当用户在屏幕上单击是会触发此方法,与上面的onSingleTapUp方法不同的地方在于,
     * 该方法只会在监听器确定了用户在第一次单击后不会触发双击事件时才会被触发。
     *
     * @param e
     * @return
     */
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        result += "onSingleTapConfirmed\n";
        tvResult.setText(result);
        return true;
    }

    /**
     * 当用户在屏幕上双击时会触发此方法。这里的按下动作事件指的时双击中的第一次触击。
     *
     * @param e
     * @return
     */
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        result += "onDoubleTap\n";
        tvResult.setText(result);
        return false;
    }

    /**
     * 在双击事件发生时会触发此方法,包括了按下、移动和抬起事件。
     *
     * @param e
     * @return
     */
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        result += "onDoubleTapEvent\n";
        tvResult.setText(result);
        return false;
    }

运行看一下效果

点击屏幕

长触摸

双击屏幕

向上滑动

向下滑动

这就是基本的事件逻辑了,可以根据自己的需求进一步做处理,比如音量屏幕左边上滑时调节亮度,右边上滑时调节音量,这都是通过在onScroll方法中做处理实现的。OK,就是这样了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发笔记(四十五)手势事件
基本的手势事件主要有如下三个方法: dispatchTouchEvent : 判断该事件是否需要下发。返回true表示需要下发给下级视图,返回false表示不需要下发(交给自身的onTouchEvent处理)。但是否最终下发,还需根据onInterceptTouchEvent的拦截结果。 onInterceptTouchEvent : 判断当前容器是否需要拦截该事件。返回true表示予以拦截(交给自身的onTouchEvent处理)、不放给下级视图,返回false表示不拦截该事件。 onTouchEvent : 判断该事件是否处理完毕。返回true表示处理完毕,则无需处理上级视图的onTouchEvent,一路返回结束流程。返回false表示该事件未完成,则返回继续处理上级视图的onTouchEvent,然后再根据上级onTouchEvent的返回值判断是直接结束还是由再上级处理。
aqi00
2019/01/18
1.3K0
Android 手势识别应用:手把手教你学会 GestureDetector(含实例讲解)
下面,我将结合实例,详细介绍GestureDetector的使用接口 & 使用类。
Carson.Ho
2020/06/10
10.9K0
Carson带你学Android:手把手教你学会手势识别应用 GestureDetector
下面,我将结合实例,详细介绍GestureDetector的使用接口 & 使用类。
Carson.Ho
2022/03/24
1.6K0
Carson带你学Android:手把手教你学会手势识别应用 GestureDetector
Android 中 View 的手势事件处理
View 作为Android中最直接的和用户进行交互的单位,对于 View 的事件处理重要程度自然不言而喻,View 的事件处理直接影响到用户体验,下面我们来看一下对 View 的触摸事件的处理:
指点
2019/01/18
1.5K0
Android 中 View 的手势事件处理
看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
像网上其他将手势监听的博客一样,本文将以双击事件为引子,逐步展开探讨 Android 手势监听,你需要知道的点点滴滴,还是那句话:看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
圆号本昊
2021/09/24
1.7K0
看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
Android手势操作耍起来!
前言 手势操作是Android交互当中至关重要的. 可以说, 如果一个软件没有好的手势操作, 就不能将其定义为移动端的软件. 这里来看下谷歌提供的GestureDetector类. 搭配属性动画使用, 效果更好哦. ---- 初步了解手势操作 先来一段可以快速了解手势操作类的代码. 这里用到了GestureDetector.SimpleOnGestureListener(), 可以暂时理解为是一个适配器, 快速实现GestureDetector.OnGestureListener接口中要实现的方法.
sean_yang
2018/09/04
9120
Android手势操作耍起来!
OnGestureListener探索
注意,没有onSingleTapUp,可见只是类似于ACTION_UP,而不等同于ACTION_UP。ACTION_UP只要抬起就会检测到,onSingleTapUp必须是没有滑动没有长按
提莫队长
2019/02/21
5170
Android 滑动效果入门篇(一)—— ViewFlipper
ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放。 又ViewAnimator继承至于FrameLayout的,所以ViewFilpper的Layout里面可以放置多个View,继承关系如下:
阳光岛主
2019/02/19
1.8K0
Android之GestureDetector使用
在 android 开发过程中,经常需要对一些手势,如:单击、双击、长按、滑动、缩放等,进行监测。
李小白是一只喵
2021/12/06
7550
Android之GestureDetector使用
详解Android View的事件体系 之View基础(二)
掌握View的事件体系是Android 向高级迈向的必经之路,本片博客讲解Android View的相关基础知识第二部分,后面我们会为大家讲解View事件体系、View事件分发等知识内容。View相关知识第一部分https://blog.csdn.net/huangliniqng/article/details/83933241
黄林晴
2019/01/10
5750
2014-11-8Android学习------手势识别事件的处理GestureDetector--------动画Animation学习篇
我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的源码 百度搜就知道很多下载的地方 网上源码的名字叫:android抽屉效果.zip 我的博客写的比较乱,如果本篇文章没有看懂,
wust小吴
2022/03/07
7460
2014-11-8Android学习------手势识别事件的处理GestureDetector--------动画Animation学习篇
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
在【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 ) 博客中完成了图像的区域解码 , 并显示在界面中 ; 本篇博客中主要完成长图滑动功能 , 触摸滑动 , 惯性滑动 , 操作 ;
韩曙亮
2023/03/27
1.6K0
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
相关推荐
Android开发笔记(四十五)手势事件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文