Android中的GestureDetector(手势)详细区分介绍

Android为了手势检测提供了GestureDetector手势识别类。GestureDetector类代表一个手势检测器,创建GestureDetector时需要传人一个GestureDetector.OnGestureListener实例,GestureDetector.OnGestureListener就是一个监听器,负责对用户的手势行为提供响应。

如果GestureDetector.SimpleOnGestureListener消耗掉了这个事件,则返回true,否则返回false
当然最后不要忘记在你的Activity中override onTouch方法来获取手势action:

GestureDetector detector;
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	textView = (TextView) findViewById(R.id.show);
	//创建手势检测器
	detector = new GestureDetector(this,this);
}

//将该Activity上的触碰时间交给GestureDetector处理
@Override  
public boolean onTouchEvent(MotionEvent event) {   
    if (detector.onTouchEvent(event))   
        return true;   
    else  
        return false;   
}



boolean  onDoubleTap(MotionEvent e) 
解释:双击的第二下Touch down时触发 
boolean  onDoubleTapEvent(MotionEvent e) 
解释:双击的第二下Touch down和up都会触发,可用e.getAction()区分。 
boolean  onDown(MotionEvent e) 
解释:当触碰时间按下时触发该方法
boolean onSingleTapUp(MotionEvent e)
解释:用户在触摸屏上的轻击时间将会触发方法 
boolean  onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
解释:Touch了滑动一点距离后,up时触发。其中velcoityX、velcoityY代表“滑动”动作在横向、纵向上的速度,e1为down时的MotionEvent,e2为up时的MotionEvent。
void  onLongPress(MotionEvent e) 
解释:Touch了不移动一直Touch down时触发 
boolean  onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
解释:Touch了滑动时触发,其中e1为down时的MotionEvent,e2为move时的MotionEvent
void  onShowPress(MotionEvent e) 
解释:Touch了还没有滑动或松开时触发 


与onDown,onLongPress比较 onDown只要Touch down一定立刻触发。 

而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。 

所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。
boolean  onSingleTapConfirmed(MotionEvent e) 
boolean  onSingleTapUp(MotionEvent e) 
解释:上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。
点击一下非常快的(不滑动)Touchup: 
onDown->onSingleTapUp->onSingleTapConfirmed 
点击一下稍微慢点的(不滑动)Touchup: 

onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed


一个小Demo详细介绍:

布局只有一个简单的TextView(id=show)

package com.example.gesturedemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.widget.TextView;
import android.widget.Toast;
/*1. 点击屏幕上的某项的执行流程  有两种情况,一种是时间很短,一种时间稍长
时间很短:onDown--------》onSingleTapUp--------》onSingleTapConfirmed
时间稍长:onDown--------》onShowPress------》onSingleTapUp--------》onSingleTapConfirmed
2. 长按事件
onDown--------》onShowPress------》onLongPress
3.抛:手指触动屏幕后,稍微滑动后立即松开
onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
4.拖动
onDown------》onScroll----》onScroll------》onFiling
注意:有的时候会触发onFiling,但是有的时候不会触发,个人理解是人的动作不标准所致。*/
public class MainActivity extends Activity implements OnGestureListener {
	GestureDetector detector;
	TextView textView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView = (TextView) findViewById(R.id.show);
		detector = new GestureDetector(this,this);
	}
	@Override
	public boolean onTouchEvent(MotionEvent me){
		return detector.onTouchEvent(me);
	}
	// 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发    
	//Touch down时触发,不论是touch (包括long) ,scroll
	@Override
	public boolean onDown(MotionEvent arg0) {
		// TODO Auto-generated method stub
		textView.setText("onDown");
		return false;
	}
	/*  
     * 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE,  
     * 1个ACTION_UP触发(non-Javadoc)  
     * Fling事件的处理代码:除了第一个触发Fling的ACTION_DOWN和最后一个ACTION_MOVE中包含的坐标等信息外 
     * ,我们还可以根据用户在X轴或者Y轴上的移动速度作为条件  
     * 比如下面的代码中我们就在用户移动超过100个像素,且X轴上每秒的移动速度大于200像素时才进行处理。  
     *   
     * @see Android.view.GestureDetector.OnGestureListener#onFling(android.view.  
     * MotionEvent, Android.view.MotionEvent, float, float)  
     * 这个例子中,tv.setLongClickable( true )是必须的,因为  
     * 只有这样,view才能够处理不同于Tap(轻触)的hold(即ACTION_MOVE,或者多个ACTION_DOWN)  
     * ,我们同样可以通过layout定义中的Android:longClickable来做到这一点  
     */
	@Override
	public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
			float arg3) {
		// 参数解释:    
        // e1:第1个ACTION_DOWN MotionEvent    
        // e2:最后一个ACTION_MOVE MotionEvent    
        // velocityX:X轴上的移动速度,像素/秒    
        // velocityY:Y轴上的移动速度,像素/秒    
   
        // 触发条件 :    
        // X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒 
		// TODO Auto-generated method stub
		textView.setText("onFling\n" + String.valueOf(arg2) + "\n" 
		+ String.valueOf(arg3) + "\n");
		return false;
	}
	// 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发 
	//Touch了不移动一直Touch down时触发
	//Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。
	@Override
	public void onLongPress(MotionEvent arg0) {
		// TODO Auto-generated method stub
		textView.setText("onLangPress");
	}
	// 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发    
	@Override
	public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
			float arg3) {
		// TODO Auto-generated method stub
		textView.setText("onScroll\n" + String.valueOf(arg2) +
				"\n" + String.valueOf(arg3) + "\n");
		return false;
	}
	/*  
    * 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发  
    * 注意和onDown()的区别,强调的是没有松开或者拖动的状态 (单击没有松开或者移动时候就触发此事件,再触发onLongPress事件)  
    */   
	//Touch了还没有滑动时触发
    //(与onDown,onLongPress比较
    //onDown只要Touch down一定立刻触发。
	@Override
	public void onShowPress(MotionEvent arg0) {
		// TODO Auto-generated method stub
		textView.setText("onShowPress");
	}
	// 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
	@Override
	public boolean onSingleTapUp(MotionEvent arg0) {
		// TODO Auto-generated method stub
		textView.setText("onSingleTapUp");
		return false;
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值