理解Android的手势识别提高APP的用户体验
2023-06-13 09:15:01 时间
对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载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:创建手势侦听对象
复制代码代码如下:
基础
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
相关文章
- android+制作开机动画,Android 开机动画制作详解
- 基于chromium for android开发Android浏览器
- android退出app代码,Android应用退出代码各种方式
- android短信验证码方案,Android之短信验证码
- Android 编译_android线程
- 【Android从零单排系列七】《Android视图控件——EditText》
- APP成本评估:安卓app系统软件开发费用明细一览表
- 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )
- 【Android Gradle 插件】Android Plugin DSL Reference 文档介绍 ( 1.2 ~ 3.4 版本文档地址 | 4.1 ~ 7.1 版本文档地址 )
- 【Android Gradle 插件】AaptOptions 配置 ① ( AaptOptions#additionalParameters 附加参数配置 | aapt 工具帮助文档 )
- 【Android Gradle 插件】DexOptions 配置 ④ ( additionalParameters 属性配置 | 使用 BuildType 配置多 dex 机制 )
- [android] 采用layoutInflater打气筒创建一个view对象详解手机开发
- android个推平台详解手机开发
- Android App瘦身实战详解手机开发
- 基于Android-28 的源码 Activity 启动流程分析详解手机开发
- 一次app抓包引发的Android分析记录
- App联手Oracle实现多样化应用(app与oracle)
- 轻松学习MYSQL下载文档App分享(MYSQL下载文档app)
- 怎么发布打包并发布自己的Android应用(APP)
- Android实现下载文件功能的方法