精华内容
下载资源
问答
  • 手势检测

    2017-07-10 20:55:18
    1.一种是手势检测 2.第二种是API手势识别 今天我就为大家带来手势的检测 布局的代码如下: ViewFlipper android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/...

    Android中提供了俩种手势:

    1.一种是手势检测

    2.第二种是API手势识别


    今天我就为大家带来手势的检测

    布局的代码如下:

    <ViewFlipper
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/vf_main_image"
        ></ViewFlipper>
    
    java代码如下:

    package com.example.android20_gesture;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.widget.ImageView;
    import android.widget.Toast;
    import android.widget.ViewFlipper;
    
    public class MainActivity extends AppCompatActivity {
    
        private ViewFlipper vf_main_image;
        private int images[]={R.drawable.s1,R.drawable.s2,R.drawable.s3};
        private GestureDetector gb;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            vf_main_image = (ViewFlipper) findViewById(R.id.vf_main_image);
            for (int i = 0; i < images.length; i++) {
                ImageView iv=new ImageView(this);
                iv.setImageResource(images[i]);
                vf_main_image.addView(iv);
            }
            //实例化手势检测器类
            gb = new GestureDetector(this, new GestureDetector.OnGestureListener() {
                //按下
                @Override
                public boolean onDown(MotionEvent e) {
                    Log.i("test","onDown");
                    return false;
                }
    
                //按下,但是未抬起
                @Override
                public void onShowPress(MotionEvent e) {
                    Log.i("test","onShowPress");
                }
    
                //轻按,按一下,立刻抬起
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    Log.i("test","onSingleTapUp");
                    return false;
                }
    
                //滚动
                @Override
                public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                    Log.i("test","onScroll");
                    return false;
                }
    
                //长按
                @Override
                public void onLongPress(MotionEvent e) {
                    Log.i("test","onLongPress");
                }
    
                //拖动
                @Override
                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                    Log.i("test","onFling");
                    if (e2.getX()-e1.getX()>200){
                        Toast.makeText(MainActivity.this, "右滑,上一张", Toast.LENGTH_SHORT).show();
                        vf_main_image.showPrevious();
                        //左进又出
                        vf_main_image.setInAnimation(MainActivity.this,R.anim.left_in);
                        vf_main_image.setInAnimation(MainActivity.this,R.anim.right_out);
                    }
                    if (e1.getX()-e2.getX()>200){
                        Toast.makeText(MainActivity.this, "左滑,下一张", Toast.LENGTH_SHORT).show();
                        vf_main_image.showNext();
                        //左出右进
                        vf_main_image.setInAnimation(MainActivity.this,R.anim.left_out);
                        vf_main_image.setInAnimation(MainActivity.this,R.anim.right_in);
                    }
                    return false;
                }
            });
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            Log.i("test","onTouchEvent");
            return gb.onTouchEvent(event);
        }
    }

    然后我这里还提供的动画:

    动画是左进右出和左出右进

    左进的代码如下:

    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="true"
        android:duration="1000"
        >
    
        <translate
            android:fromXDelta="-100%p"
            android:toXDelta="0"
            ></translate>
    
            <rotate
                android:fromDegrees="0"
                android:toDegrees="360"
                ></rotate>
    左出的代码如下:

    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="true"
        android:duration="1000"
        >
    
        <translate
            android:fromXDelta="0"
            android:toXDelta="-100%p"
            ></translate>
    
    
        <rotate
            android:fromDegrees="0"
            android:toDegrees="360"
            ></rotate>
    </set>

    右进的代码:

    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="true"
        android:duration="1000"
        >
    
        <translate
            android:fromXDelta="100%p"
            android:toXDelta="0"
            ></translate>
    
        <rotate
            android:fromDegrees="0"
            android:toDegrees="360"
            ></rotate>
    </set>

    右出的代码:

    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="true"
        android:duration="1000"
        >
            <translate
                android:fromXDelta="100%p"
                android:toXDelta="0"
                ></translate>
    
            <rotate
                android:fromDegrees="0"
                android:toDegrees="360"
                ></rotate>
    </set>

    这里再给一张图片提供自学:



    展开全文
  • 支持8方位的滑动手势检测和缩放手势检测
  • 手势检测代码

    2015-08-12 09:21:23
    基于opencv实现手势检测,十分实用有效,共初学者使用。
  • IOS手势检测

    2017-08-29 15:30:27
    IOS手势检测

    1.响应者链

    当用户点击屏幕时,会产生一个响应事件。这个事件一般由当前的第一响应者First responder(即当前用户交互的控件,一般为UIView或者其继承类)进行监听处理。如果该控件不处理点击事件,那事件就会被传播到他对应的视图控制器,如果视图控制器也不做处理,就会被传播给控件的父视图。

    响应链的传播如下:

    First Responder -> First Responder的ViewController -> 父视图 -> 父视图的ViewController -> UIWindow -> UIApplication -> UIApplication Delegate -> 丢弃

    在某个控件截获事件时,也可以通过代码进行手动的传递(详情可以自行在开发文档搜索):

    self.nextResponder //返回nil或者下一个响应object

    2.响应事件

    当用户触碰屏幕时,会分别响应控件的以下4个方法。我们可以利用这个四个方法来自定义捕捉用户的手势行为,利用touches获得点击位置,event获得事件类型

    //当用户手指开始触碰窗口时响应该方法
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        NSLog(@"touch!");
    }
    /*
    //当用户手指在控件上移动时触发
    -(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    //当用户手指结束触碰时触发
    -(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    //当系统事件终止了触碰事件时触发
    -(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    */

    3. 使用IOS自带的手势处理器

    对于一些常见的手势如点击,捏合,横扫等,苹果提供了自带的API可以直接检测这些手势并响应。

    //点击
    UITapGestureRecognizer;
    //捏合
    UIPinchGestureRecognizer;
    //旋转
    UIRotationGestureRecognizer;
    //扫
    UISwipeGestureRecognizer;
    //拖动
    UIPanGestureRecognizer;
    //还有其他
    这些处理器都是继承了UIGestureRecognizer的子类。

    手势处理器的使用一般分为三个步骤:创建,设置,添加。下面以UISwipeGestureRecognizer为例:


    //设置视图支持用户交互
        self.view.userInteractionEnabled = true;
        //设置视图支持多点触碰
        self.view.multipleTouchEnabled = true;
        //创建上下左右四个方向手势处理器
        for(int i=0; i<4; i++){
            //创建处理轻扫手势的手势处理器
            UISwipeGestureRecognizer* gesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipe:)];
            //设置处理器只处理一个手指的触碰
            gesture.numberOfTouchesRequired = 1;
            //指定轻扫方向
            gesture.direction = 1<<i;
            //添加该控制器
            [self.view addGestureRecognizer:gesture];
        }
    //手势触发方法
    - (void)handleSwipe:(UISwipeGestureRecognizer*)gesture {
        //获取轻扫手势
        NSUInteger direction = gesture.direction;
        //输出方向
        switch (direction) {
            case UISwipeGestureRecognizerDirectionLeft:
                NSLog(@"Left");
                break;
            case UISwipeGestureRecognizerDirectionRight:
                NSLog(@"Right");
                break;
            case UISwipeGestureRecognizerDirectionUp:
                NSLog(@"Up");
                break;
            case UISwipeGestureRecognizerDirectionDown:
                NSLog(@"Down");
                break;
            default:
                break;
        }
        
    }

    4. 自定义手势处理器

    可以创建一个新类来继承UIGestureRecognizer,并重写4个touches的响应事件,在适当的时候设置类对象的属性state为UIGestureRecognizerStateCancelled或者UIGestureRecognizerStateEnded(将会触发处理手势的方法)来表示自定义手势的识别的成功与否即可。


    附上一个用上下左右轻扫手势控制移动的简易贪吃蛇:

    Snake


    展开全文
  • 动态手势检测与分类

    2021-02-07 03:02:47
    动态手势检测与分类
  • 主要介绍了Android开发之手势检测及通过手势实现翻页功能的方法,结合实例形式分析了Android GestureDetector类实现手势检测功能的相关操作技巧,需要的朋友可以参考下
  • Android屏幕手势检测的原理是由于触摸事件的检测与识别比较繁琐,因此Android提供了手势检测器帮助开发者识别手势。利用手势检测器可以自动辨别常用的几个手势事件,如点击、长按、滑动等,从而使开发者专注于业务...
  • 手势检测(基于OpenCV)

    千次下载 热门讨论 2011-11-02 14:20:05
    用opencv2.3.1做的静态手势检测。先滤波去噪-->转换到HSV空间-->根据皮肤在HSV空间的分布做出阈值判断,这里用到了inRange函数,然后进行一下形态学的操作,去除噪声干扰,是手的边界更加清晰平滑-->得到的2值图像后...
  • 基于OpenCV+vs2008的手势检测,检测英文字母A的手势,利用了OpenCV的haar特征级联分类器,效果可好
  • 主要为大家详细介绍了Android GestureDetector用户手势检测实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 基于opencv的模板匹配方式手势检测,供初学者使用学习。
  • 手势检测.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 针对手脸遮挡条件下的手语视频手势检测问题,提出一种基于力场(force field)转换的手势检测算法。首先分别计算手脸遮挡帧和纯脸部帧的力场图像,然后将力场图像分块并统计各分块直方图特征,再将相同空间位置的分块直方...
  • 手势检测.rar
  • 基于OpenCV 动态 手势检测识别 方法的 研究
  • 安卓Android源码——手势检测.zip
  • ARKit之路-手势检测

    2020-09-01 21:58:03
      智能移动设备的手势操作是使用者接受并已习惯的操作方式,在移动端AR应用中,对虚拟物体的操作也基本通过手势操作完成,本节我们将学习一些手势检测基础知识。需要注意的是本节中描述的手势检测是指用户在手机...

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。

      智能移动设备的手势操作是使用者接受并已习惯的操作方式,在移动端AR应用中,对虚拟物体的操作也基本通过手势操作完成,本节我们将学习一些手势检测基础知识。需要注意的是本节中描述的手势检测是指用户在手机屏幕上的手指操作检测,不是指利用图像技术对使用者手部运动的检测。

    (一)手势检测定义

      手势检测是指通过检测使用者在手机屏幕上的手指触控运动来判断其操作意图的技术,如单击、双击、缩放、滑动等等,常见的手势操作如下图所示。
    在这里插入图片描述

    (二)ARKit中的手势检测

      ARKit提供了对触控设备底层API的访问权限和高级手势检测功能,可以满足不同的手势定制需求。底层API访问能够获取手指点击的原始位置、压力值、速度信息,高级手势检测功能则借助手势识别器(Gesture Recognizer)来识别预设手势(包括单击、双击、长按、滑动、缩放、平移等)。

      在AR应用中,对虚拟物体最常见的3种操控方式分别为平移、缩放、旋转,为简化手势使用难度,RealityKit使用installGestures()方法对单物体操控提供快捷支持,该方法原型为:

      @discardableResult func installGestures(_ gestures: ARView.EntityGestures = .all, for entity: HasCollision) -> [EntityGestureRecognizer]

      其中参数gestures为ARView.EntityGestures枚举类型,用于指定可执行的手势操作,entity指定需要使用手势操作的实体(Entity)。ARView.EntityGestures枚举包含all、rotation、scale、translation4个枚举值,涵盖了最常见的旋转、缩放、平移操作。使用installGestures()方法为entity添加手势操作时,entity需要遵循HasCollision协议,简单讲就是虚拟物体必须要有碰撞器(CollisionShapes),因为本质上手势操作也首先要用射线检测进行碰撞检查,不带碰撞器的虚拟元素无法参与碰撞检测。在如下代码清单中,我们创建了一个正方体,然后通过程序的方式生成碰撞器,再调用installGestures()方法,允许用户对该立方体进行操控。

    func createPlane(){
        let planeAnchor = AnchorEntity(plane:.horizontal)
        do {
            let cubeMesh = MeshResource.generateBox(size: 0.1)
            var cubeMaterial = SimpleMaterial(color:.white,isMetallic: false)
            cubeMaterial.baseColor = try .texture(.load(named: "Box_Texture.jpg"))
            let cubeEntity = ModelEntity(mesh:cubeMesh,materials:[cubeMaterial])
            cubeEntity.generateCollisionShapes(recursive: false)
            planeAnchor.addChild(cubeEntity)
            self.scene.addAnchor(planeAnchor)
            self.installGestures(.all,for:cubeEntity)
        } catch {
            print("找不到文件")
        }
    }
    

      RealityKit还定义了EntityRotationGestureRecognizer、EntityScaleGestureRecognizer、EntityTranslationGestureRecognizer 3个专门用于实体操作的手势识别器,利用这3个手势识别器可以非常方便的对实体进行旋转、缩放、平移操作,如下代码清单所示。

    var cubeEntity : ModelEntity?
    var gestureStartLocation: SIMD3<Float>?
    
    extension ARView :ARSessionDelegate{
        func createPlane(){
            let planeAnchor = AnchorEntity(plane:.horizontal)
            do {
                let cubeMesh = MeshResource.generateBox(size: 0.1)
                var cubeMaterial = SimpleMaterial(color:.white,isMetallic: false)
                cubeMaterial.baseColor = try .texture(.load(named: "Box_Texture.jpg"))
                cubeEntity = ModelEntity(mesh:cubeMesh,materials:[cubeMaterial])
                cubeEntity!.generateCollisionShapes(recursive: false)
                cubeEntity?.name = "this is a cube"
                planeAnchor.addChild(cubeEntity!)
                self.scene.addAnchor(planeAnchor)
                self.installGestures(.all,for:cubeEntity!).forEach{
                    $0.addTarget(self, action: #selector(handleModelGesture))
                }
            } catch {
                print("找不到文件")
            }
        }
        
        @objc func handleModelGesture(_ sender: Any) {
            switch sender {
            case let rotation as EntityRotationGestureRecognizer:
                print("Rotation and name :\(rotation.entity!.name)")
                rotation.isEnabled = false
            case let translation as EntityTranslationGestureRecognizer:
                print("translation and name \(translation.entity!.name)")
                 if translation.state == .ended || translation.state == .cancelled {
                    gestureStartLocation = nil
                    return
                }
                guard let gestureCurrentLocation = translation.entity?.transform.translation else { return }
                guard let _ = gestureStartLocation else {
                    gestureStartLocation = gestureCurrentLocation
                    return
                }
                let delta = gestureStartLocation! - gestureCurrentLocation
                let distance = ((delta.x * delta.x) + (delta.y * delta.y) + (delta.z * delta.z)).squareRoot()
                print("startLocation:\(String(describing: gestureStartLocation)),currentLocation:\(gestureCurrentLocation),the distance is \(distance)")
                
            case let Scale as EntityScaleGestureRecognizer:
                Scale.removeTarget(nil, action: nil)
                Scale.addTarget(self, action: #selector(handleScaleGesture))
            default:
                break
            }
        }
        
        @objc func handleScaleGesture(_ sender : EntityScaleGestureRecognizer){
            print("in scale")
        }
    }
    

      在上面代码清单中,我们演示了如何取消原手势的执行,如何获取实体对象真实移动距离,以及如何将手势处理转发到另一个处理方法中。

      除了RealityKit自定义的EntityGestureRecognizer,所有的UIGestureRecognizer也都可以使用,包括UITapGestureRecognizer (轻点手势识别器)、UIPinchGestureRecognizer( 捏合手势识别器)、UIRotationGestureRecognizer( 旋转手势识别 器)、UISwipeGestureRecognizer (滑动手势识别器)、UIPanGestureRecognizer (拖动手势识别器)、UIScreenEdgePanGestureRecognizer (屏幕边缘拖动手势识别器)、UILongPressGestureRecognizer (长按手势识别器)等等。但因为这类手势并非专为实体操作而设计,因此开发者需要自行处理手势操作对象行为。

      在RealityKit中,手势识别器一般都会提供手势操作不同状态的方法或者事件,方便开发者调用,具体如下表所示。

    功能描述
    touchesBegan(Set, with: UIEvent)当用户用一个或几个手指触控屏幕时
    touchesMoved(Set, with: UIEvent)当用户用一个或几个手指在屏幕上滑动时
    touchesCancelled(Set, with: UIEvent)当用户在进行操作时,一个系统事件的发生中断了用户的操作(如突然来电话)时
    touchesEnded(Set, with: UIEvent)当用户一个或多个手指从屏幕上抬起时
    展开全文
  • 设计并实现超声波简易手势检测系统,采用NE555及运放产生45 kHz正弦波信号,信号由超声波探头发出,遇到障碍物后被反射回来,由麦克风接收,接收的信号经放大去噪后经AD633模拟乘法器与原正弦波混频,经高通滤波、...
  • 针对汽车驾驶环境中的手势交互需求,提出了一个基于改进的自生成神经网络的手势检测和识别方法。该方法主要分为手势分割、特征提取和手势识别三部分。首先采用基于粒子群优化的自生成神经网络聚类算法检测并分割图像...
  • 手势检测与识别

    2018-07-11 15:51:27
    手势识别检测与识别,良好的鲁棒性,能实现基本的手势判别,C++实现
  • 内容索引:VC/C++源码,图形处理,OpenCV,鼠标手势 opencv 手势检测,多指尖检测,源代码,还有不少地方需要完善。
  • 这是一个 RGB和手势传感器,小接口板具有内置APDS-9960传感器,提供环境光与颜色测量,接近检测和非接触手势检测。有了这个RGB和手势感应器,你就可以控制一台计算机,单片机,机器人,它比你的手一个简单的刷卡功能...
  • 基于Hu不变矩向量的手势检测,隋云衡,郭元术,手势检测是手势交互的基础和前提,其本质是从背景中分割出手部区域。本文着重研究了复杂背景下的手部区域分割方法,提出了基于Hu�
  • 基于计算机视觉的手势检测识别技术.pdf
  • gesture-detection:简单的手势检测

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,008
精华内容 9,603
关键字:

手势检测