zoukankan      html  css  js  c++  java
  • Android学习(十六) 通过GestureDetector进行手势识别

    一、手势交互过程:

      1)触屏时,触发MotionEvent事件。

      2)被OnTouchListener监听,在onTouch()中获得MotionEvent对象。

      3)GestureDetector转发MotionEvent对象至OnGestureListener。

      4)OnGestureListener获得该对象,根据该对象封装的信息做出合适的反馈。

    二、需要用到的类和接口

      1、MotionEvent:

      1)用于封装手势、触摸笔,轨迹球等动作事件。

      2)内部封装用于记录横轴和纵轴坐标的属性X和Y。

      

      2、GestureDetector:

      识别各种手势:按下,移动,弹起。

      3、OnGestureListener接口

      1)手势交互的监听接口,其提供多个抽象方法。

        a) onDown(MotionEvent e);   //单击

        b) onSingleTapUp(MotionEvent e);  //抬起

        c) onShowPress(MotionEvent e);   //短按

        d) onLongPress(MotionEvent e);   //长按

        e) onScoll(MotionEvent e1,MotionEvent e2,float distanceX,float distanceY)  //滚动

        f) onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY)    //滑动

      2)根据GestureDetector的手势识别结果调用相对应的方法。

      4、OnDoubleTapListener接口:

        a) onDoubleTap(MotionEvent e);   //双击

        b) onDoubleTapEvent(MotionEvent e);  //双击按下和抬起各触发一次

        c) onSingleTapConfirmed(MotionEvent e);  //单击确认,很快的按下并弹起,但不点击第二下。

      5、SimpleOnGesttureListener类,实现了OnGestureListener和OnDoubleTapListener接口,如果我们需要实现手势,只需要继承这个类,实现对应的手势方法即可。

        

    示例:根据左右拖拽切换图片,直接实现接口

    main.xml,添加一个ImageView显示图片,默认显示第一张图片

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <ImageView
            android:id="@+id/img_girl"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/girl1" />
    
    </LinearLayout>

    main.java

    package com.example.gesturedetectordemo;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.GestureDetector;
    import android.view.GestureDetector.OnGestureListener;
    import android.view.GestureDetector.SimpleOnGestureListener;
    import android.view.Menu;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity implements OnTouchListener, OnGestureListener {
    
        //定义一个GestureDetector对象,用来处理各种手势,实现了OnTouchListener接口
        GestureDetector myGestureDetector;
        // 图片框
        ImageView imggirl;
        // 存放女孩图片的数组
        int[] girls = { R.drawable.girl1, R.drawable.girl2, R.drawable.girl3, R.drawable.girl4, R.drawable.girl5 };
        // 存放数组下标
        private int index;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            myGestureDetector = new GestureDetector(this);
    
            imggirl = (ImageView) findViewById(R.id.img_girl);
    
            //添加OnTouchListener事件
            imggirl.setOnTouchListener(this);
            //下面两个要记得设哦,不然就没法处理轻触以外的事件了,例如抛掷动作。
            imggirl.setLongClickable(true); 
            myGestureDetector.setIsLongpressEnabled(true); 
        }
    
        // 向后移动
        public void goNext() {
            index++;
            index = Math.abs(index % girls.length);
            imggirl.setImageResource(girls[index]);
        }
    
        // 向前移动
        public void goPrevious() {
            index--;
            index = Math.abs(index % girls.length);
            imggirl.setImageResource(girls[index]);
        }
    
        @Override  //处理用户的触碰请求
        public boolean onTouch(View v, MotionEvent event) {
            //转交给GestureDetector来处理
            myGestureDetector.onTouchEvent(event);
            return false;
        }
    
        @Override  //在按下动作时被调用 
        public boolean onDown(MotionEvent e) {
            //goNext();
            return false;
        }
    
        @Override  //按下动作松开被调用
        public void onShowPress(MotionEvent e) {
            // TODO Auto-generated method stub
    
        }
    
        @Override  //在弹起时被调用
        public boolean onSingleTapUp(MotionEvent e) {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override  //在滚动时被调用
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override   //在长按时被调用
        public void onLongPress(MotionEvent e) {
            // TODO Auto-generated method stub
    
        }
    
        @Override  //在抛掷动作时被调用 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if (e1.getX() - e2.getX() > 50) {
                goNext();
                Toast.makeText(MainActivity.this, "从右向左拖拽" + index, Toast.LENGTH_SHORT).show();
            } else if (e2.getX() - e1.getX() > 50) {
                goPrevious();
                Toast.makeText(MainActivity.this, "从左向右拖拽" + index, Toast.LENGTH_SHORT).show();
            }
            return false;
        }
    
    }

      

  • 相关阅读:
    生成器,迭代器
    装饰器
    作业修改配置文件 查询,添加
    continue 和 break的实例
    作业,修改haproxy配置文件
    zabbix分布式部署
    zabbix全网监控介绍
    nginx+tomcat9+memcached-session-manager会话共享
    tomcat管理登陆界面无法进行登陆
    JAVA与tomcat部署
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/4402067.html
Copyright © 2011-2022 走看看