0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android手势检测之GestureDetector全面分析

哆啦安全 来源:Android开发编程 2023-04-19 14:43 次阅读

前言

当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等;

Android sdk给我们提供了GestureDetector类,通过这个类我们可以识别很多的手势;

今天就来学习下;

一、GestureDetector介绍

GestureDetector这个类对外提供了两个接口和一个外部类

接口:OnGestureListener,OnDoubleTapListener

内部类:SimpleOnGestureListener

89c9d15a-de7b-11ed-bfe3-dac502259ad0.png

GestureDetector类介绍

private class Gesturelistener implements GestureDetector.OnGestureListener{
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
// TODO Auto-generated method stub
return false;
}
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
return false;
}
}

这里总共重写了六个函数

1、OnDown(MotionEvent e):用户按下屏幕就会触发;

2、onShowPress(MotionEvent e):如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行

3、onLongPress(MotionEvent e):长按触摸屏,超过一定时长,就会触发这个事件,触发顺序:onDown->onShowPress->onLongPress

4、onSingleTapUp(MotionEvent e):一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件;触发顺序:Touchup:onDown->onSingleTapUp->onSingleTapConfirmed ;

onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发;

参数解释:

e1:第1个ACTION_DOWN MotionEvent

e2:最后一个ACTION_MOVE MotionEvent

velocityX:X轴上的移动速度,像素/秒

velocityY:Y轴上的移动速度,像素/秒

5、onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖动事件;无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发;

滑屏:手指触动屏幕后,稍微滑动后立即松开

onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling

拖动

onDown------》onScroll----》onScroll------》onFiling

无论是滑屏,还是拖动,影响的只是中间OnScroll触发的数量多少而已,最终都会触发onFling事件;

二、实现GestureDetector

1、实现OnGestureListener接口中的方法(可以使用匿名内部类或实现了接口的类实例);

class MyGestureListener implements GestureDetector.OnGestureListener {
    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }
    @Override
    public void onShowPress(MotionEvent e) {
    }
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }
    @Override
    public void onLongPress(MotionEvent e) {
    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        return false;
    }
}

2、创建GestureDetector类的实例,构造函数如下:

public GestureDetector(OnGestureListener listener, Handler handler) {
    this(null, listener, handler);
}
public GestureDetector(OnGestureListener listener) {
    this(null, listener, null);
}
public GestureDetector(Context context, OnGestureListener listener) {
    this(context, listener, null);
}
public GestureDetector(Context context, OnGestureListener listener, Handler handler) {
}
public GestureDetector(Context context, OnGestureListener listener, Handler handler,
        boolean unused) {
    this(context, listener, handler);
}
mGestureDetector = new GestureDetector(mContext,new MyGestureListener());

3、 实现View.OnTouchListener接口,重写onTouch()方法

4、在onTouch()方法中拦截事件处理,将控制权交给GestureDector;

@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}

5、调用控件的View.setOnTouchListener()将接口的具体实现的引用传递进去或者如果是监听双击的话调用GestureDetector .setOnDoubleTapListener()

super.setOnTouchListener(this);

mGestureDetector.setOnDoubleTapListener(new MyGestureListener());

package com.test.test;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
/*
 * 
 */
public class MyView extends View implements View.OnTouchListener{
    private Context mContext;
    private GestureDetector mGestureDetector;
    private static final String TAG = "MyView";
    public MyView(Context context) {
        super(context);
        initData(context);
    }
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initData(context);
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initData(context);
    }
    private void initData(Context context) {
        this.mContext = context;
        super.setOnTouchListener(this);
        super.setClickable(true);
        super.setLongClickable(true);
        super.setFocusable(true);
        mGestureDetector = new GestureDetector(mContext,new MyGestureListener());
        mGestureDetector.setOnDoubleTapListener(new MyGestureListener());
    }
    /*
     * 当该view上的事件被分发到view上时触发该方法的回调
     * 如果这个方法返回false时,该事件就会被传递给Activity中的onTouchEvent方法来处理
     * 如果该方法返回true时,表示该事件已经被onTouch函数处理玩,不会上传到activity中处理
     * 该方法属于View.OnTouchListening接口
     */
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }
    /*
     * 手势监听类
     */
    class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        public MyGestureListener() {
            super();
        }
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.e(TAG, "onDoubleTap");
            return true;
        }
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.e(TAG, "onDoubleTapEvent");
            return true;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.e(TAG, "onSingleTapConfirmed");
            return true;
        }
        @Override
        public boolean onContextClick(MotionEvent e) {
            Log.e(TAG, "onContextClick");
            return true;
        }
        @Override
        public boolean onDown(MotionEvent e) {
            Log.e(TAG, "onDown");
            return true;
        }
        @Override
        public void onShowPress(MotionEvent e) {
            Log.e(TAG, "onShowPress");
        }
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.e(TAG, "onSingleTapUp");
            return true;
        }
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            Log.e(TAG, "onScroll");
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
            Log.e(TAG, "onLongPress");
        }
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            Log.e(TAG, "onFling");
            return true;
        }
    }
}

自定义控件继承了View实现了View.OnTouchListener。监听的方法用的是继承SimpleOnGestureListener类,重写了所有方法。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3851

    浏览量

    125642
  • 触摸屏
    +关注

    关注

    42

    文章

    2131

    浏览量

    113656

原文标题:Android手势检测-GestureDetector全面分析

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Android系统开发蓝牙开发案例分析

    主题:Android系统开发蓝牙设备访问技术要点分析及经典案例课程内容:本专题围绕Android中蓝牙技术及设备访问要点进行介绍,为您解决蓝牙开发过程中经常遇到的问题,最后以“智能医
    发表于 07-24 16:32

    Android 手势识别

    本帖最后由 kiter_rp 于 2014-9-11 14:23 编辑 总体来分析手势有关涉及到手势匹配相关的源码类之间的关系,如下图: 上图中的相关类简介:GestureLibrary:
    发表于 09-11 14:22

    [资料分享]+大话企业级Android应用开发实战

    55336.1.2 单击事件 55536.1.3 加入手势 55636.1.4 手势应用 559第8话 android硬件操作 56137 “机器人”的第六感——传感器 56238
    发表于 09-26 10:31

    [资料分享]+《Android软件安全与逆向分析

    Android 病毒的全面剖析。本书适合所有Android 应用开发者、Android 系统开发工程师、Android 系统安全工作者阅读学
    发表于 09-26 10:53

    干货!Android蓝牙驱动开发经验

    Bluetooth协议栈分析43.1 蓝牙协议栈43.2 Android与蓝牙协议栈的关系5四 BluetoothHCI层分析54.1 HCI层与基带的通信方式64.2 包的
    发表于 02-29 15:53

    Androidwifi分析(上)

    Androidwifi分析(上)
    发表于 11-02 10:53

    RK3399 Android8.1调试记录DDR问题分析

    1、RK3399 Android8.1调试记录DDR问题分析  Platform: RK3399  OS: Android 8.1  DDR型号:K4F6E3S4HM-MGCJ  现
    发表于 09-06 17:38

    谷歌为Android 2.0操作系统研发出"手势

    谷歌为Android 2.0操作系统研发出"手势搜索" 3月5日消息,据国外媒体报道,谷歌公司已经为Android 2.0操作系统研发出新的搜索工具:“手势搜索(Gesture Se
    发表于 03-05 09:04 467次阅读

    用户手势检测-GestureDetector使用详解

    安卓APP开发中的部分功能实现代码:用户手势检测-GestureDetector使用详解
    发表于 03-03 16:16 2次下载

    动态手势检测与分类

    提出一种对视频流中的连续手势进行检测和分类的方法.检测的目的是找到这些手势的开始帧和结束帧.提出的融合音频和视觉信息的检测方法确保了
    发表于 01-03 15:23 0次下载

    AndroidQ或将加入向后滑动手势

    谷歌在Android 9 Pie上首次引入手势控制时,许多的用户觉得这些手势控制还不成熟。用户只能单一的方向上切换应用,而且任务之间的过滤动画衔接的不流畅。幸运的是,在Android
    的头像 发表于 04-24 11:27 2211次阅读

    谷歌分享关于下一代Android系统AndroidQ的更多细节

    怎么样,这样的操作逻辑是不是有了种似曾相识的感觉?此外,屏幕下方的小白条也充当多任务切换手势,左右滑动可切换在后台运行的所有程序。全面手势的加入,会使得现在的全面屏手机得到更多的显示
    的头像 发表于 05-13 16:13 2877次阅读

    Android还是没找到比iOS更好用的手势操作

    近期,Google 推送了 Android Q Beta 3 测试版系统更新,在这个版本中,用户可以用上和 iOS 一模一样的手势交互。
    的头像 发表于 05-20 14:45 2337次阅读

    谷歌推出AndroidQBeta5 加入下拉通知栏手势

    谷歌已经推出Android Q Beta 5,加入了许多人性化功能,其中一项是下拉通知栏手势
    的头像 发表于 07-11 09:05 4577次阅读

    消息称Android 12有望重新引入双击背面手势

    双击背面手势已经在很多手机系统中搭载了,包括苹果最新的 iOS 14、小米的 MIUI 12 等。 谷歌也曾在 Android 11 预览版中加入了双击背面手势功能,该功能代号为 “Columbus
    的头像 发表于 01-25 09:13 1125次阅读