您的位置:首页 > 移动开发 > Android开发

Android手势

2013-10-13 23:07 591 查看
通常用到的手势识别包括OnTouchListener和GestureDetector.OnGestureListener。
OnTouchListener是一切触摸事件的监听器,它会接收到一切的触摸事件。当我们点击屏幕、滑动、长按都会出现各种效果,其实这是由OnTouchListener监听到了,然后交给GestureDetector处理,GestureDetector通过分析知道当前的触摸事件是什么样的,再告诉OnGestureListener,就调用OnGestureListener中的对应方法处理事件。因为OnGestureListener是GestureDetector类用的接口,当然是通过 . 来引用了。说白了,GestureDetector只是封装了一些常用的手势,方便我们使用。在OnTouchListener中,我们完全可以自定义手势,而不用GestureDetector来分析。

让事实说话吧,举例子


package org.robam.touchtest;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity implements OnTouchListener,
OnGestureListener {

TextView textview;
ScrollView scrollview;
private static final String TAGTOUCH = "OnTouchListener";
private static final String TAGGESTRURE = "OnGestureListener";
private GestureDetector GD;

@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.textview);

textview.setOnTouchListener(this);   //给TextView设置触摸的监听器,它才会响应触摸事件
GD = new GestureDetector(this); //new 一个手势识别器
}

//这是OnTouchListener接口的唯一方法,TextView的触摸事件首先由它处理
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e(TAGTOUCH, "onTouchListener -- onTouch");
return GD.onTouchEvent(event);    //这一句话很关键,调用GestureDetector的onTouchEvent方法,意思是交GestureDetector处理
}

//GestureDetector处理完后,如果匹配一下6个方法,就给相应的方法处理,以下6个方法都是OnGestureListener中定义的

/* 顾名思义手指按下的时候就会触发
* @see android.view.GestureDetector.OnGestureListener#onDown(android.view.MotionEvent)
*/
@Override
public boolean onDown(MotionEvent e) {
Log.e(TAGGESTRURE, "OnGestureListener -- onDown");
return true;   //注意这个返回值好像要true,后面的onFling和onScroll才能被处理哦!
}

/*
* The user has performed a down MotionEvent and not performed a move or up yet.
* This event is commonly used to provide visual feedback to the user to let them know that
*  their action has been recognized i.e. highlight an element.
*  当用户按下没有移动或者放开手指时触发,根据名字可以看出,它是用来show显示一些提示信息的。
*  这个方法在按紧0.18秒触发,不能滑动也不能放开
*  注意跟下面的onLongPress区别,其实只不过这个时间短一点,本质是一样的
* @see android.view.GestureDetector.OnGestureListener#onShowPress(android.view.MotionEvent)
*/
@Override
public void onShowPress(MotionEvent e) {
Log.e(TAGGESTRURE, "OnGestureListener -- onShowPress");
}

/*
* 手指按下后弹开的时候触发
* 注意,只要手指滑动了再弹开,它是不会触发的。而且长按后也不会触发。也就是在按下0到0.68秒间放开触发
* @see android.view.GestureDetector.OnGestureListener#onSingleTapUp(android.view.MotionEvent)
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.e(TAGGESTRURE, "OnGestureListener -- onSingleTabUp");
return true;
}

/*
* 从名字可以看出,它是滚动的时候触发。
* 那它在滚动的过程中会触发多少次呢?、
* 一秒钟内会触发很多次,但我暂时不知道在哪里找确切的答案,onTouch触发多少次就是多少。
* 还有,这也是要滑动一定的距离才会触发,到底多少,暂时找不到答案,原谅我!
* @see android.view.GestureDetector.OnGestureListener#onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float)
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.e(TAGGESTRURE, "OnGestureListener -- onScroll --- " + e1.getX()
+ "----" + e2.getX());
return true;
}

/*
* 长按触发事件,不用多说,前提是不能滑动。
* 关键是:多少秒算长按呢?没错,就是 0.18 + 0.5 = 0.68 秒
* @see android.view.GestureDetector.OnGestureListener#onLongPress(android.view.MotionEvent)
*/
@Override
public void onLongPress(MotionEvent e) {
Log.e(TAGGESTRURE, "OnGestureListener -- onLongPress");
}

/*
* 这就是滑动之后放开手指触发的事件,当然触发也是有条件的,
* 就是... 滑动速度要达到系统定义的最小值。跟手机的dip息息相关。
* 手机dip/160 * 100 * 50 + 0.5,就是每秒要划过这么多像素才会触发。
* @see android.view.GestureDetector.OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float)
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
Log.e(TAGGESTRURE, "OnGestureListener -- onFling");
return true;
}
}


Layout文件如下:

<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">
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_world"
android:textSize="30sp" />
</LinearLayout>


运行程序后在LogCat可以看到各个事件的触发情况。

其实上面解释 都差不多了,就不再啰嗦!我是从分析GestureDetector源码得到的,最关键的当然是识别手势的具体函数 onTouchEvent……

有什么不对请拍砖~ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: