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;
    }

}

  

时间: 2024-08-25 12:12:37

Android学习(十六) 通过GestureDetector进行手势识别的相关文章

android学习十八(Service服务的基本用法)

定义一个服务 在项目中定义一个服务,新建一个ServiceTest项目,然后在这个项目中新增一个名为MyService的类,并让它继承自Service,完成后的代码如下所示: package com.jack.servicetest; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyService extends Service { @Over

android学习十二(android的Content Provider(内容提供器)的使用)

文件存储和SharePreference存储以及数据存储一般为了安全,最好用于当前应用程序中访问和存储数据.内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性.目前使用内容提供器是android实现跨程序共享数据的标准方式.内容提供器可以选择只对一部分数据进行共享,从而保证我们的程序中的隐私数据不会有泄漏的风险. 内容提供器的用法一般有两种,一种是使用现有的内容提

Android学习十---Android Camera

Android camera用来拍照和拍摄视频的先看一下最后实现的效果图             最后的效果图 一.准备 在你的应用程序上使用android拍照设备,需要考虑以下几个方面 1. 是否是一定需要camera 如果需要,那么就无法安装在没有摄像头的设备. 需要在mainfest 中声明 <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:nam

android学习十九(WebView的用法)

android提供了一个WebView控件,借助它我们就可以在自己的应用程序中嵌入一个浏览器,从而轻松的展示各种各样的网页.下面来学习下简单的用法.新建一个WebViewTest项目,然后修改activity_main.xml中的代码,如下所示: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/

android学习十四(android的接收短信)

收发短信是每个手机基本的操作,android手机当然也可以接收短信了.android系统提供了一系列的API,使得我们可以在自己的应用程序里接收和发送短信. 其实接收短信主要是利用我们前面学过的广播机制.当手机接收到一条短信的时候,系统会发出一条值为andorid.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据.每个应用程序都可以在广播接收器里对它进行监听,收到广播时在从中解析出短信的内容即可. 下面我们来个具体的例子实践下吧,新建一个

android 学习教程六之----四大组件之一——BroadcastReciever

博客好长时间没有更新了,做个基础总结,继续之前的,温故而知新!该系列为入门篇,大神可以绕道! 大家好,今天给大家详解一下Android中的BroadcastReceiver.在Android中,在Android中,Broadcast是一种广 泛运用的在应用程序之间传输信息的机制是一种广泛运用的在应用程序之间传输信息的机制,本质上是一种全局的监 听器,用于监听系统全局的广播消息. BroadcastReceiver 有两种注册方式:一:静态注册方式 :二:动态注册方式 一:静态注册方式就是在Anr

Android入门(十六)调用摄像头相册

原文链接:http://www.orlion.ga/665/ 一.调用摄像头 创建一个项目ChoosePicDemo,修改activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent&qu

Android学习十:appcompat_v7相关

error: Error retrieving parent for item: No resource found that matches the given name 'android:Wind 首先把android-support-v7-appcompat 导入Eclipse File->Import (android-sdk(你的Android SDK目录)\extras\android\support\v7). 选择 "appcompat" 然后选择你的Project

Android学习笔记六:六大布局

六大界面布局方式包括: 线性布局(LinearLayout).帧布局(FrameLayout).表格布局(TableLayout).相对布局(RelativeLayout).绝对布局(AbsoluteLayout)和网格布局(GridLayout) . 1. LinearLayout线性布局 LinearLayout容器中的组件一个挨一个排列,通过控制android:orientation属性,可控制各组件是横向排列还是纵向排列. LinearLayout的常用XML属性及相关方法 XML属性

Android学习十二:跑马灯程序实现(简单联系)

package org.tonny; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.w