深入理解Android手势识别
对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了。
基础
GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手势。
GestureDetector提供了两个侦听器接口,OnGestureListener处理单击类消息,OnDoubleTapListener处理双击类消息。
OnGestureListener的接口有这几个:
//单击,触摸屏按下时立刻触发 abstractbooleanonDown(MotionEvente); //抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势) abstractbooleanonSingleTapUp(MotionEvente); //短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会 abstractvoidonShowPress(MotionEvente); //长按,触摸屏按下后既不抬起也不移动,过一段时间后触发 abstractvoidonLongPress(MotionEvente); //滚动,触摸屏按下后移动 abstractbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY); //滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势 abstractbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY); OnDoubleTapListener的接口有这几个: //双击,手指在触摸屏上迅速点击第二下时触发 abstractbooleanonDoubleTap(MotionEvente); //双击的按下跟抬起各触发一次 abstractbooleanonDoubleTapEvent(MotionEvente); //单击确认,即很快的按下并抬起,但并不连续点击第二下 abstractbooleanonSingleTapConfirmed(MotionEvente);
有时候我们并不需要处理上面所有手势,方便起见,Android提供了另外一个类SimpleOnGestureListener实现了如上接口,我们只需要继承SimpleOnGestureListener然后重载感兴趣的手势即可。
应用
STEP1:创建手势侦听对象
packagenoodies.blog.csdn.net;
importandroid.content.Context;
importandroid.view.MotionEvent;
importandroid.view.GestureDetector.SimpleOnGestureListener;
importandroid.widget.Toast;
publicclassMyGestureListenerextendsSimpleOnGestureListener{
privateContextmContext;
MyGestureListener(Contextcontext){
mContext=context;
}
@Override
publicbooleanonDown(MotionEvente){
Toast.makeText(mContext,"DOWN"+e.getAction(),Toast.LENGTH_SHORT).show();
returnfalse;
}
@Override
publicvoidonShowPress(MotionEvente){
Toast.makeText(mContext,"SHOW"+e.getAction(),Toast.LENGTH_SHORT).show();
}
@Override
publicbooleanonSingleTapUp(MotionEvente){
Toast.makeText(mContext,"SINGLEUP"+e.getAction(),Toast.LENGTH_SHORT).show();
returnfalse;
}
@Override
publicbooleanonScroll(MotionEvente1,MotionEvente2,
floatdistanceX,floatdistanceY){
Toast.makeText(mContext,"SCROLL"+e2.getAction(),Toast.LENGTH_SHORT).show();
returnfalse;
}
@Override
publicvoidonLongPress(MotionEvente){
Toast.makeText(mContext,"LONG"+e.getAction(),Toast.LENGTH_SHORT).show();
}
@Override
publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,
floatvelocityY){
Toast.makeText(mContext,"FLING"+e2.getAction(),Toast.LENGTH_SHORT).show();
returnfalse;
}
@Override
publicbooleanonDoubleTap(MotionEvente){
Toast.makeText(mContext,"DOUBLE"+e.getAction(),Toast.LENGTH_SHORT).show();
returnfalse;
}
@Override
publicbooleanonDoubleTapEvent(MotionEvente){
Toast.makeText(mContext,"DOUBLEEVENT"+e.getAction(),Toast.LENGTH_SHORT).show();
returnfalse;
}
@Override
publicbooleanonSingleTapConfirmed(MotionEvente){
Toast.makeText(mContext,"SINGLECONF"+e.getAction(),Toast.LENGTH_SHORT).show();
returnfalse;
}
}
STEP2:设置手势识别
我们可以在Activity里设置手势识别:
packagenoodies.blog.csdn.net;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.GestureDetector;
importandroid.view.MotionEvent;
publicclassGestureTestActivityextendsActivity{
privateGestureDetectormGestureDetector;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mGestureDetector=newGestureDetector(this,newMyGestureListener(this));
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
returnmGestureDetector.onTouchEvent(event);
}
}
也可以在自定义的View里面设置手势识别:
packagenoodies.blog.csdn.net;
importandroid.content.Context;
importandroid.util.AttributeSet;
importandroid.view.GestureDetector;
importandroid.view.MotionEvent;
importandroid.view.View;
publicclassMyViewextendsView{
privateGestureDetectormGestureDetector;
publicMyView(Contextcontext,AttributeSetattrs){
super(context,attrs);
mGestureDetector=newGestureDetector(context,newMyGestureListener(context));
setLongClickable(true);
this.setOnTouchListener(newOnTouchListener(){
publicbooleanonTouch(Viewv,MotionEventevent){
returnmGestureDetector.onTouchEvent(event);
}
});
}
}
陷阱
对于自定义View,使用手势识别有两处陷阱可能会浪费你的不少时间。
1:View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down,Show,Long三种手势
2:必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作
测试结果
下面是各种操作返回的手势序列,数值0表示触摸屏按下,1表示抬起
单击:down0,singleup1,singleconf0
短按:down0,show0,singleup1
长按:down0,show0,long0
双击:down0,singleup1,double0,doubleevent0,down0,doubleevent1
滚动:down0,(show0),scrool2...
滑动:down0,(show0),scrool2...,fling1
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。