当前位置:首页 » 安卓系统 » android判断手势

android判断手势

发布时间: 2023-04-05 19:36:25

A. android 手势判断是横向滑动还是纵向 csdn

对于Android中的手势识别可以从以下三个Listener入手——OnTouchListener、OnGestureListener、OnDoubleTapListener。这三个监听器分别是触摸监听、手势滑动监听和屏幕双击操作监听。很多的时候我们需要这些手势识别的操作,例如我们自定义控件的时候就经常会用到。下面就对这三个监听器分别进行介绍。

触摸监听器OnTouchListener
让我们的Activity去现实此接口,并重写onTouch方法。重写OnTouchListener的onTouch方法 此方法在触摸屏被触摸,即发生触摸事件(接触和抚摸两个事件)的时候被调用。示范代码如下:

@Override
public boolean onTouch(View v, MotionEvent event) {
detector.onTouchEvent(event);
Toast.makeText(this, "onTouch", TIME_OUT).show();
return true;
}

手势滑动监听器OnGestureListener
让我们的Activity去现实此接口,并重写onFling、onLongPress、onScroll、onDown、onShowPress、onSingleTapUp方法。示范代码如下:

/**
* 手势滑动时别调用
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {

if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE) {
Toast.makeText(this, "向左滑动", TIME_OUT).show();
} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE) {
Toast.makeText(this, "向右滑动", TIME_OUT).show();
}
return false;
}

/**
* 长按时被调用
*/
@Override
public void onLongPress(MotionEvent e) {
Toast.makeText(this, "触发长按回调", TIME_OUT).show();
}

/**
* 滚动时调用
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
Toast.makeText(this, "触发滚动回调", TIME_OUT).show();
return false;
}

/**
* 在按下动作时被调用
*/
@Override
public boolean onDown(MotionEvent e) {
Toast.makeText(this, "按下回调", TIME_OUT).show();
return false;
}

/**
* 按住时被调用
*/
@Override
public void onShowPress(MotionEvent e) {
Toast.makeText(this, "按住不松回调", TIME_OUT).show();
}

/**
* 抬起时被调用
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
Toast.makeText(this, "触发抬起回调", TIME_OUT).show();
return false;
}

双击屏幕监听器OnDoubleTapListener
让我们的Activity去现实此接口,并重写onDoubleTap、onDoubleTapEvent、onSingleTapConfirmed方法。示范代码如下:

@Override
public boolean onDoubleTap(MotionEvent arg0) {
Toast.makeText(this, "触发双击回调", TIME_OUT).show();
return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent arg0) {
Toast.makeText(this, "触发双击的按下跟抬起回调", TIME_OUT).show();
return false;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent arg0) {
Toast.makeText(this, "触发单击确认回调", TIME_OUT).show();
return false;
}

B. Android使用GestureDetector进行手势检测

在操作应用的时候,会有很多不同的手势操作,如按下、单击、双击、长按等手势,我们可以在这些手势事件中添加相应的业务逻辑,那么如何检测不同的手势操作就比较重要了,本文将带大家了解如何使用GestureDetector进行手势检测。

进行手御磨势检测之前,需要先册滚新建GestureDetector对象,示例如下:

示例中重写了Activity的onTouchEvent(MotionEvent event)方法,并在其内部使用GestureDetector处理触摸事件,示例如下:

实现GestureDetector.OnGestureListener内的方法,在其中可以检测到多种手势,如onDown(MotionEvent e)按下、onShowPress(MotionEvent e)已经执行按下,还没州拆余有移动或抬起、onSingleTapUp(MotionEvent e)单击、onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)滚动、onLongPress(MotionEvent e)长按、onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)。

双击手势也是一种常见的手势事件,使用GestureDetector检测双击手势需要调用setOnDoubleTapListener()方法设置GestureDetector.OnDoubleTapListener(),并实现其中的方法,其中的onDoubleTap(MotionEvent e)表示双击事件,示例如下:

如果不想实现GestureDetector.OnGestureListener
内的多个方法,那么可以创建类并继承GestureDetector.SimpleOnGestureListener,示例如下:

在创建GestureDetector对象的时候,传入扩展后的类对象即可,示例如下:

使用GestureDetector能方便地进行手势检测,灵活合理地使用手势检测,在其中处理应用的业务逻辑,能让体验更加的友好。

C. android 关于手势检测的问题

用onTouch监听,他有3个,down,move,up,三个事件,并且提供了X和Y轴的坐标,如果你只要左右的话,在down的时候获取到他的X的坐标,然后move或者up的时候再次获取坐标,如果X变大了就是往右了,变小了就是往左

D. android 双指手势问题

判断pointer1和pointer2的down,同时为down时在move事件中去做距离的计算(起始距离至少为60),记录两点的起始位置和结束位置。当两点起始距离达到要求的时候执行跳转。
如果你要做角度。(只允许这一种情况下)左边的起始X肯定大于结束X,起始Y肯定大于结束Y;右边的起始X肯定小于结束X,起始Y肯定大于结束Y。

E. Android事件分发机制是怎么判断手势类型,并决定分发给哪个view的

可以参考如下内容:
dispatchTouchEvent -> onTouch -> onTouchEvent
等上述的up事件分发完结后,再调用onClick
看起来一目了然,事实上,我只是用了默认的调用,在TextView的dispatchTouchEvent和onTouchEvent都是让它返回super.xxx。而且在onTouch监听里返回的是false。
所以,实际的情况更多,基于此,为了更清晰地熟悉事件分发机制,我们只能通过看源码了。
源码分析
我目前查看的源码是API 22环境下的。这部分关于View的事件分发的源码和之前的有很大的区别,但是,万变不如其中,有些根本的逻辑流程一般是不会改变的。
我们直接看View的代码,因为控件都继承自View。

F. android开发中 顺时针或者逆时针旋转手势如何检测

这个真心不好判断,因为6也是个逆时针,这个起点终点和轨迹都不好判断

G. 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种)

热点内容
lgg3如何设置锁屏密码 发布:2025-07-04 06:41:39 浏览:343
sqlserver2005命令 发布:2025-07-04 06:27:08 浏览:731
压缩文件啥样 发布:2025-07-04 06:21:42 浏览:297
linux的回车换行 发布:2025-07-04 06:21:39 浏览:131
c语言的窗口 发布:2025-07-04 06:20:54 浏览:982
androidk线图 发布:2025-07-04 06:19:15 浏览:130
华为荣耀6短信加密 发布:2025-07-04 06:18:30 浏览:814
sqlserver2008链接 发布:2025-07-04 06:15:54 浏览:906
ueditor的图片上传 发布:2025-07-04 06:09:09 浏览:539
iis7匿名访问 发布:2025-07-04 05:53:33 浏览:319