Android用户手势检测

简介: Android用户手势检测

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


接口:OnGestureListener,OnDoubleTapListener


:第一个接口处理手势,第二个接口 处理 单击或者双击


内部类:SimpleOnGestureListene


: 这个外部类 就是 接口中的所有函数的集成,他包含了这两个接口里所有需要实现的函数,并且进行了重写,但是所有的方法体都是空的;该类是 static class ,程序员可以在外部继承这个类,重写里面的手势 方法。


1,使用接口


使用如下:


public class GestureListener implements GestureDetector.OnGestureListener ,
    GestureDetector.OnDoubleTapListener{
    private static final String TAG = "GestureListener";
    // 用户按下屏幕就会触发;
    @Override
    public boolean onDown(MotionEvent e) {
        Log.e(TAG, "onDown: 按下屏幕就会触发" );
        return false;
    }
    //用户按下屏幕,尚未松开或 者拖动 则会触发
    @Override
    public void onShowPress(MotionEvent e) {
        Log.e(TAG, "onShowPress: 按下屏幕,尚未松开或 者拖动" );
    }
    // 用户点击屏幕后松开,则会触发该事件
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.e(TAG, "onSingleTapUp: 点击屏幕后松开" );
        return false;
    }
    /**
     * 用户按下屏幕,并拖动
     * @param distanceX x 轴滑动距离
     * @param distanceY y 轴滑动距离
     */
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.e(TAG, "onScroll: 用户按下屏幕,并拖动" );
        return false;
    }
    // 用户长按屏幕,
    @Override
    public void onLongPress(MotionEvent e) {
        Log.e(TAG, "onLongPress:长按屏幕 " );
    }
    /**
     * 用户按下屏幕,快速移动后松开,
     * @param e1 按下的 event
     * @param e2 抬起的 event
     * @param velocityX x 轴上的移动速度 像素 每秒
     * @param velocityY y 轴上的移动速度 像素 每秒
     */
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.e(TAG, "onFling: 用户按下屏幕,快速移动后松开," );
        return false;
    }
    //单击事件,
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        Log.e(TAG, "onSingleTapConfirmed: 点击" );
        return false;
    }
    // 双击 事件
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.e(TAG, "onDoubleTap: 双击" );
        return false;
    }
    // 双击 间隔中发生的动作
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        Log.e(TAG, "onDoubleTapEvent: 双击中的间隔" );
        return false;
    }
}


上面实现了 两个接口 重写了所有的方法,注释已经写在方法上面了。


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建 gestureDetector 对象,传入 onGestureListener 的实例
        mGestureDetector = new GestureDetector(new GestureListener());
        CustomVolumeControlBar controlBar = findViewById(R.id.controlBar);
        //触摸事件
        controlBar.setOnTouchListener(this);
        //获取焦点
        controlBar.setFocusable(true);
        //启用或者禁用 单击事件
        controlBar.setClickable(true);
        //启用或者禁用 长按事件
        controlBar.setLongClickable(true);
    }
    /**
     * 通过调用 GestureDetector 的 onTouchEvent()方法,将捕捉到的 MotionEvent 交给 GestureDetector
     * 来分析 是否由合适的 callback 函数来处理用户的手势
     */
    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }


上面对一个 自定义View 进行了手势检测。手势检测的接口 和 双击 的接口 都已经实现,可以使用


2,使用内部类


使用内部类的方式,使用这种方式 可以根据情况,用到那个方法就重写那个方法:


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //创建 gestureDetector 类的 静态内部类来实现,可以重写任意的方法
    mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener(){
        final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            //小例子:判断是左滑 还是右滑
            if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY){
                Log.e(TAG, "onFling: 左滑"+e1.getX()+"------"+e2.getX() );
            }else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY){
                Log.e(TAG, "onFling: 右滑 "+e1.getX()+"------"+e2.getX()  );
            }
            return false;
        }
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.e(TAG, "onDoubleTapEvent: 双击" );
            return false;
        }
    });
    CustomVolumeControlBar controlBar = findViewById(R.id.controlBar);
    //触摸事件
    controlBar.setOnTouchListener(this);
    //获取焦点
    controlBar.setFocusable(true);
    //启用或者禁用 单击事件
    controlBar.setClickable(true);
    //启用或者禁用 长按事件
    controlBar.setLongClickable(true);
}
/**
 * 通过调用 GestureDetector 的 onTouchEvent()方法,将捕捉到的 MotionEvent 交给 GestureDetector
 * 来分析 是否由合适的 callback 函数来处理用户的手势
 */
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}
相关文章
|
10月前
|
Android开发
如何在Android真机上检测是否有Google Map add-on
如何在Android真机上检测是否有Google Map add-on
98 3
|
5月前
|
设计模式 Java Android开发
安卓应用开发中的内存泄漏检测与修复
【9月更文挑战第30天】在安卓应用开发过程中,内存泄漏是一个常见而又棘手的问题。它不仅会导致应用运行缓慢,还可能引发应用崩溃,严重影响用户体验。本文将深入探讨如何检测和修复内存泄漏,以提升应用性能和稳定性。我们将通过一个具体的代码示例,展示如何使用Android Studio的Memory Profiler工具来定位内存泄漏,并介绍几种常见的内存泄漏场景及其解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的技巧和方法,帮助你打造更优质的安卓应用。
|
8月前
|
监控 Java Android开发
探究Android应用开发中的内存泄漏检测与修复
在移动应用的开发过程中,优化用户体验和提升性能是至关重要的。对于Android平台而言,内存泄漏是一个常见且棘手的问题,它可能导致应用运行缓慢甚至崩溃。本文将深入探讨如何有效识别和解决内存泄漏问题,通过具体案例分析,揭示内存泄漏的成因,并提出相应的检测工具和方法。我们还将讨论一些最佳实践,帮助开发者预防内存泄漏,确保应用稳定高效地运行。
|
10月前
|
Android开发
android检测网络连接是否存在(一)
android检测网络连接是否存在(一)
76 2
|
10月前
|
Android开发
安卓手机快速过检测完成某某学习
安卓手机快速过检测完成某某学习
82 0
|
10月前
|
XML 监控 Java
Android App开发之事件交互Event中检测软键盘和物理按键讲解及实战(附源码 演示简单易懂)
Android App开发之事件交互Event中检测软键盘和物理按键讲解及实战(附源码 演示简单易懂)
898 0
|
Android开发 UED
Android版本检测更新升级
Android版本检测更新升级
|
API Android开发
使用Android的Service实现后台定时检测并重启应用
使用Android的Service实现后台定时检测并重启应用
|
Android开发
全网最优雅安卓列表项可见性检测
全网最优雅安卓列表项可见性检测
213 0
|
算法 数据挖掘 Android开发
全网最优雅安卓控件可见性检测
全网最优雅安卓控件可见性检测
275 0

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    Android实战经验之Kotlin中快速实现MVI架构
  • 10
    即时通讯安全篇(一):正确地理解和使用Android端加密算法