当前位置:首页 » 安卓系统 » android长按监听

android长按监听

发布时间: 2023-09-12 17:56:40

Ⅰ Android 双击单击事件监听手势检测GestureDetector原理及实现

app我们常用的手势有很多的地方,比如右滑关闭界面等。手势控制分为触发动作(Touch Mechanics,用户手指在屏幕上如何动作)和触发行为(Touch Activities,界面上特定动作在特定情境下引发的结果)。这是因为同样的触发动作(如单次触击)在不同情境下可能会带来不同的结果(如轻触,取消,开启/关闭指示),同样单次触发行为(如放大)可能是由多种触发动作(如捏放,双次触击,双次触击拖拽等)实现。

    一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。

    Android sdk给我们提供了GestureDetector类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。

一.GestureDetector简介

1.组成

GestureDetector类用来识别触摸屏的各种手势,它包含了两个接口和一个内部类:

接口:

OnGestureListener:用来监听手势事件(6种)。

OnDoubleTapListener:用来监听双击事件。

内部类:

SimpleOnGestureListener:用来监听所有的手势。实际上它实现了上述两个接口,不过方法体是空的,需要我们自己写。我们可以继承这个类,重写里面的方法进行手势处理。

2.构造

GestureDetector gestureDetector = new GestureDetector(GestureDetector.OnGestureListener listener);

GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.OnGestureListener listener);

GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);

3.方法

(1)onTouchEvent(MotionEvent ev) 分析捕捉到的触摸事件触发相应的回调函数

(2)setIsLongpressEnabled(boolean isLongpressEnabled) 设置“长按”是否可用

(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener) 设置双击监听器

4.使用

流程:

首先,系统捕捉屏幕的触摸事件(onTouchListener),这时还未涉及具体手势,只是简单地捕捉到触摸。

接着,在onTouch()方法中调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector来处理

最后,还需要实现抽象方法。

可根据需要选择:

重写OnGestureListener并通过构造函数传入gestureDetector

重写OnDoubleTapListener并通过GestureDetector.setOnDoubleTapListener方法传入gestureDetector

重写SimpleOnGestureListener并通过构造函数传入gestureDetector

实现:

注:不要注重我写的类是什么类,要注重实现方法自定义view和activity中都可以,根据需要继承上面三种listener,传入构造函数即可;

public class TestDemo{

Context context;

public TestDemo(Context context){

this.context = context;

}

private GestureDetectordetector;

private void initView(){

detector =new GestureDetector(context, new MySimple());

detector =new GestureDetector(context, new MyGesture());

detector =new GestureDetector(context, new MyDoubleTap());

setOnTouchListener((v, event) -> {

// 事件监听交给手势类来处理

detector.onTouchEvent(event);

return true;

});

}

//与上面二选一

@Override

public boolean onTouchEvent(MotionEvent event) {

return detector.onTouchEvent(event);

}

// 手势监听器类SimpleOnGestureListener

    private class MySimple extends GestureDetector.SimpleOnGestureListener {

        @Override

        public boolean onSingleTapUp(MotionEvent e) {//一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发;如果除了Down以外还有其它操作,那就不再是Single操作了,所以也就不会触发这个事件

            return super.onSingleTapUp(e);

        }

        @Override

        public void onLongPress(MotionEvent e) {//长按事件;

            super.onLongPress(e);

        }

        @Override

        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖动事件,只要手指移动就会执行,无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发他不会执行MotionEvent.ACTION_UP,通常用来实现放大缩小和移动。

            return false;

        }

        @Override

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑动屏幕,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发;是个甩的动作,这个甩的动作是在一个MotionEvent.ACTION_UP(手指抬起)发生时执行,通常用来实现翻页效果

            return super.onFling(e1, e2, velocityX, velocityY);

        }

        @Override

        public void onShowPress(MotionEvent e) {//down事件发生而move或则up还没发生前触发该事件;

            super.onShowPress(e);

        }

        @Override

        public boolean onDown(MotionEvent e) {//down事件用户按下屏幕

            return super.onDown(e);

        }

        @Override

        public boolean onDoubleTap(MotionEvent e) {//双击事件

            return super.onDoubleTap(e);

        }

        @Override

        public boolean onDoubleTapEvent(MotionEvent e) {//双击间隔中还发生其他的动作。通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知)

            return super.onDoubleTapEvent(e);

        }

        @Override

        public boolean onSingleTapConfirmed(MotionEvent e) {//单击事件。用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。

            return super.onSingleTapConfirmed(e);

        }

    }

// 手势监听器类GestureListener

    private class MyGesture extends GestureDetector.OnGestureListener{

        @Override

        public boolean onDown(MotionEvent e) {//down事件用户按下屏幕

            return false;

        }

        @Override

        public void onShowPress(MotionEvent e) {//down事件发生瞬间而move或则up还没发生前触发该事件;

        }

        @Override

        public boolean onSingleTapUp(MotionEvent e) {//一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发;如果除了Down以外还有其它操作,那就不再是Single操作了,所以也就不会触发这个事件;

            return super.onSingleTapUp(e);

        }

        @Override

        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖动事件,只要手指移动就会执行,无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发他不会执行MotionEvent.ACTION_UP,通常用来实现放大缩小和移动。

            return false;

        }

        @Override

        public void onLongPress(MotionEvent e) {//长按事件,超过一定时长触发该事件回调;

            super.onLongPress(e);

        }

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑动屏幕,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发;是个甩的动作,这个甩的动作是在一个MotionEvent.ACTION_UP(手指抬起)发生时执行,通常用来实现翻页效果

            return super.onFling(e1, e2, velocityX, velocityY);

        }

    }

// 手势监听器类SimpleOnGestureListener

    private class MyDoubleTap extends GestureDetector.OnDoubleTapListener {

        @Override

        public boolean onDoubleTap(MotionEvent e) {//双击事件

            return super.onDoubleTap(e);

        }

        @Override

        public boolean onDoubleTapEvent(MotionEvent e) {//双击间隔中还发生其他的动作。通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知)

            return super.onDoubleTapEvent(e);

        }

        @Override

        public boolean onSingleTapConfirmed(MotionEvent e) {//单击事件。用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。

            return super.onSingleTapConfirmed(e);

        }

    }

}

关于onFling()和onScroll()的区别:

onFling()是甩,这个甩的动作是在一个MotionEvent.ACTION_UP(手指抬起)发生时执行,而onScroll(),只要手指移动就会执行。他不会执行MotionEvent.ACTION_UP。onFling通常用来实现翻页效果,而onScroll通常用来实现放大缩小和移动。

关于onSingleTapConfirmed和onSingleTapUp的一点区别: OnGestureListener有这样的一个方法onSingleTapUp,和onSingleTapConfirmed容易混淆。二者的区别是:onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行

SimpleOnGestureListener是GestureDetector类的一个内部类,该类是static class,也就是说它实际上是一个外部类。可以在外部继承这个类,重写里面的手势处理方法。

1.OnDoubleTapListener是用来检测鼠标双击事件的

2.SimpleOnGestureListener实际上实现了OnGestureListener 和OnDoubleTapListener,所以它可以完成以上提到的所有手势识别(9种)

Ⅱ Android 如何判断屏幕长按,

Android系统自带了长按事件,setOnLongClickListener即可监听。也可以自己定义(不用系统的长按事件),比如当希望长按的时间更长一点的时候。这时候就需要自己来定义这个长按事件了。

Ⅲ android listview长按

是这样的,你在长按监听返回值返回为true ,返回true意味着长按监听消耗了这个事件,就不会传递下去了,也就不会触发OnItemClickListener这个了。(有空去看看事件分发的源码吧)

Ⅳ android 编程 按住 按一下 松开 分别如何监听

分别实现listener并 为按键set 相应的listener.
长按是onLongClickListener
短按是onClickListener
放开好像没有这个接口,那就只能用onTouch了, event.getAction() == MotionEvent.ACTION_UP 就是放手了

Ⅳ android 中怎么监听按键的长按事件

长按事件一般是放到 onKeyLongPress 函数中来处理的。
那具体是怎么做的呢,下面请看步骤:
先在 onKeyDown 函数中判断 event.getRepeatCount 的次数(实际上长按就是由一系列的onKeyDown事件触发的)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
if (mCameraAppView.getVisibility() != View.VISIBLE) {
return false;
}
Log.v(TAG,"onKeyDown event.getRepeatCount() "+event.getRepeatCount());
if (event.getRepeatCount() == 0) {
event.startTracking();
return true;
}
return true;
}
return super.onKeyDown(keyCode, event);
}

Ⅵ android 中怎么监听按键的长按事件

现在手机物理按键越来越少
常见的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU
在一个activity 重载父类 的下面这三个方法来处理按键事件
public boolean onKeyDown(int keyCode, KeyEvent event)
public boolean onKeyUp(int keyCode, KeyEvent event)
public boolean onKeyLongPress(int keyCode, KeyEvent event)
很明显,长按事件一般是放到 onKeyLongPress 函数中来处理的。

Ⅶ 如何监听Android电源键长按

如果要执行长按事件的话,必须先执行event.startTracking(); 然后onKeyLongPress(int, KeyEvent)才能被调到。更多内容 欢迎访问
是说在dispatchkeyevent里先执行event.startTracking(); 然后才super.dispatchKeyE……

你可以这样子做:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
if(keyCode == KeyEvent.KEYCODE_POWER){
event.startTracking();
}
}

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
return super.onKeyLongPress(keyCode, event);
}

这样子你的onKeyLongPress方法就会被执行到了。

希望能对你有用!

Ⅷ android单例中的监听如何回调

1) OnClickListener 接口
此接口处理的是单击事件,例如,在 View 上进行单击动作,在 View 获得焦点的情况下单击“确定”按钮或者单击轨迹球都会触发该事件。
当单击事件发生时,OnClickListener 接口会回调 public void onClick(View v) 方法对事件进行处理。其中参数 v 指的是发生单击事件的 View 组件。
2) OnLongClickListener 接口
此接口处理的是长按事件,当长时间按住某个 View 组件时触发该事件。
其对应的回调方法为 public boolean onLongClick(View v),当返回 true 时,表示已经处理完此事件,若事件未处理完,则返回 false,该事件还可以继续被其他监听器捕获并处理。
3) OnFocusChangeListener 接口
此接口用于处理 View 组件焦点改变事件。当 View 组件失去或获得焦点时会触发该事件。
其对应的回调方法为 public void onFocusChange(View v, Boolean hasFocus),其中参数 v 表示产生事件的事件源,hasFocus 表示事件源的状态,即是否获得焦点。
4) OnKeyListener 接口
此接口用于对手机键盘事件进行监听,当View获得焦点并且键盘被敲击时会触发该事件。
其对应的回调方法为 public boolean onKey(View v, int keyCode, KeyEvent event)。

热点内容
创建数据库过程 发布:2025-01-31 20:06:31 浏览:429
诺安成长与鑫灵活配置哪个好 发布:2025-01-31 19:58:54 浏览:604
b树磁盘存储 发布:2025-01-31 19:42:53 浏览:837
联想小新air15怎么配置环境 发布:2025-01-31 19:06:57 浏览:968
什么配置玩3a 发布:2025-01-31 19:05:22 浏览:586
phpoa系统 发布:2025-01-31 18:58:42 浏览:10
值e的编程 发布:2025-01-31 18:57:06 浏览:977
安卓手机的软件认证在哪里 发布:2025-01-31 18:57:01 浏览:535
android弹出来 发布:2025-01-31 18:56:56 浏览:232
办公室白领新解压方法 发布:2025-01-31 18:55:23 浏览:558