Android手势识别——上下左右滑动、屏幕上下左右中区域处理
手势识别GestureDetector
关于手势识别是Android为了方便开发人员处理屏幕上的触摸、拖动、单双击、滑动等提供的一组接口。用这个我们可以很方便的在屏幕上做出想要的效果,比如滑动翻页、触摸不同区域采用不同处理等。
在日常生活中,我们常用的手机浏览器等,都有这样的应用。比如,当你用手机浏览器看小说时,点击屏幕下方,会翻到下一页;点击屏幕上方,会翻到上一页;当你点击屏幕中央时,出现目录选择等;
现在就看下如何实现以上我们提到的效果。
手势识别涉及的接口或者类
手势识别涉及的接口有:OnGestureListener、OnDoubleTapListener;涉及的类有:SimpleOnGestureListener。
OnGestureListener接口
这里我们新建一个类,来实现该接口。类中实现所有方法,代码如下:
package com.example.androiddetector_csdn;import android.content.Context;
import android.util.Log;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;public class GuestureImp implements OnGestureListener{Context context;View view;String tag="me";public GuestureImp(Context ct,View vw) {// TODO Auto-generated constructor stubcontext=ct;view=vw;}@Overridepublic boolean onDown(MotionEvent arg0) {// TODO Auto-generated method stubLog.e(tag, "down-"+"x:"+arg0.getX()+"y:"+arg0.getY());return true;}@Overridepublic boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {// TODO Auto-generated method stubreturn true;}@Overridepublic void onLongPress(MotionEvent arg0) {// TODO Auto-generated method stubLog.e(tag, "onLongPress-"+"x:"+arg0.getX()+"y:"+arg0.getY());}@Overridepublic boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {// TODO Auto-generated method stubLog.e(tag, "onScroll-"+"x:"+arg0.getX()+"y:"+arg0.getY());return false;}@Overridepublic void onShowPress(MotionEvent arg0) {// TODO Auto-generated method stubLog.e(tag, "onShowPress-"+"x:"+arg0.getX()+"y:"+arg0.getY());}@Overridepublic boolean onSingleTapUp(MotionEvent arg0) {// TODO Auto-generated method stubLog.e(tag, "onSingleTapUp-"+"x:"+arg0.getX()+"y:"+arg0.getY());return false;}}
这里的方法解释,引用网上的解释如下:
按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress): 手指按在持续一段时间,并且没有松开。
滚动(onScroll): 手指在触摸屏上滑动。
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):手指离开触摸屏的那一刹那。
看解释就能理解我们可以用这个接口,做哪些操作。如果你要做滑动的控制,那么,你可以把代码写到onFling中,如果你要做拖动的操作,代码写到onScroll中。
一般情况下,运行顺序有以下几种:
onDown-onSingleTapUp;
onDown-onShowPress-onLongPress;
网上也有总结一个规律:
任何手势动作都会先执行一次按下(onDown)动作。
长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。
按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。
长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。
在这里有个要注意的地方,就是onDown的返回值,如果你设为false,经测试,它就一直只执行onDown-onShowPress-onLongPress;其他的并不会执行。
如果设为true,则正常。
OnDoubleTapListener接口
package com.example.androiddetector_csdn;import android.util.Log;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.MotionEvent;public class DoubleTabImp implements OnDoubleTapListener{String tag="me";public DoubleTabImp() {// TODO Auto-generated constructor stub}@Overridepublic boolean onSingleTapConfirmed(MotionEvent paramMotionEvent) {// TODO Auto-generated method stubLog.e(tag, "onSingleTapConfirmed");return false;}@Overridepublic boolean onDoubleTap(MotionEvent paramMotionEvent) {// TODO Auto-generated method stubLog.e(tag, "onDoubleTap");return false;}@Overridepublic boolean onDoubleTapEvent(MotionEvent paramMotionEvent) {// TODO Auto-generated method stubLog.e(tag, "onDoubleTapEvent");return false;}}
我们用写log的形式,来看它们的执行顺序。
12-04 15:00:34.434: E/me(25274): down
12-04 15:00:34.524: E/me(25274): onSingleTapUp
12-04 15:00:34.614: E/me(25274): onDoubleTap
12-04 15:00:34.614: E/me(25274): onDoubleTapEvent
12-04 15:00:34.624: E/me(25274): down
12-04 15:00:34.684: E/me(25274): onDoubleTapEvent
如果是单击,顺序如下:
12-04 15:15:33.664: E/me(25274): down
12-04 15:15:33.764: E/me(25274): onSingleTapUp
12-04 15:15:33.964: E/me(25274): onSingleTapConfirmed
SimpleOnGestureListener类
这个类,实际上是实现了以上两个接口的一个类。使用的时候,可以继承这个类,选择你要的方法来实现相应的操作。
package com.example.androiddetector_csdn;import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;public class SimpleGuestureImp extends SimpleOnGestureListener{public SimpleGuestureImp() {// TODO Auto-generated constructor stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn super.onSingleTapUp(e);}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stubsuper.onLongPress(e);}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn super.onScroll(e1, e2, distanceX, distanceY);}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stubreturn super.onFling(e1, e2, velocityX, velocityY);}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stubsuper.onShowPress(e);}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn super.onDown(e);}@Overridepublic boolean onDoubleTap(MotionEvent e) {// TODO Auto-generated method stubreturn super.onDoubleTap(e);}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {// TODO Auto-generated method stubreturn super.onDoubleTapEvent(e);}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {// TODO Auto-generated method stubreturn super.onSingleTapConfirmed(e);}}
这里很齐全,什么都不缺了。
手势识别——滑动的使用
package com.example.androiddetector_csdn;import android.os.Bundle;
import android.app.Activity;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.RelativeLayout;
import android.widget.TextView;public class MainActivity extends Activity implements OnTouchListener {GestureDetector mGestureDetector; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView=(TextView)findViewById(R.id.mytext);GuestureImp imp=new GuestureImp(MainActivity.this,textView);mGestureDetector=new GestureDetector(MainActivity.this, imp);mGestureDetector.setOnDoubleTapListener(new DoubleTabImp());textView.setOnTouchListener(this);}@Overridepublic boolean onTouch(View arg0, MotionEvent arg1) {// TODO Auto-generated method stubboolean temp= mGestureDetector.onTouchEvent(arg1);return temp;}
}
另外,重点在于,在OnGestureListener接口的实现中,写入以下代码:
@Overridepublic boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {// TODO Auto-generated method stubint mini_width=120;int mini_speed=0;float distance_right=arg1.getX()-arg0.getX();float distance_left=arg0.getX()-arg1.getX();float distance_down=arg1.getY()-arg0.getY();float distance_up=arg0.getY()-arg1.getY();if(distance_right>mini_width && Math.abs(arg2)>mini_speed){Log.e(tag, "onFling-"+"向右滑动");}else if(distance_left>mini_width && Math.abs(arg2)>mini_speed){Log.e(tag, "onFling-"+"向左滑动");}else if(distance_down>mini_width && Math.abs(arg2)>mini_speed){Log.e(tag, "onFling-"+"向下滑动");}else if(distance_up>mini_width && Math.abs(arg2)>mini_speed){Log.e(tag, "onFling-"+"向上滑动");}return true;}
第一个参数MotionEvent,是指首次触摸屏幕时的状态;第二个参数MotionEvent是最后一次触摸屏幕时的状态;第三个参数,是在X轴上滑动的速度,单位是像素/s;第四个参数,是在Y轴上滑动的速度,单位是像素/s。
以上就是,我们在view上滑动操作的实现;
屏幕上分区域点击实现不同操作
package com.example.androiddetector_csdn;import android.content.Context;
import android.graphics.Point;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;public class MatchXY {String tag="me";Context context;View view;public MatchXY(Context ct,View vw) {// TODO Auto-generated constructor stubcontext=ct;view=vw;}public ResultStatus GetWhereAreYou(float x,float y){WindowManager wm =(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);//过时的方法int width = wm.getDefaultDisplay().getWidth();int height = wm.getDefaultDisplay().getHeight();Log.e(tag, "deprecated--width:"+width+" height:"+height);//level 13以上可用的方法Point point=new Point();wm.getDefaultDisplay().getSize(point);int width_here=point.x;int height_here=point.y;Log.e(tag, "now--width:"+width_here+" height:"+height_here);//取屏幕中心点的坐标int center_x=width_here/2;int center_y=height_here/2;Log.e(tag, "center_x:"+center_x+" center_y:"+center_y);//以与中心四分之一距离作为临界点int min_center_x=center_x-center_x/4;int max_center_x=center_x+center_x/4;int min_center_y=center_y-center_y/4;int max_center_y=center_y+center_y/4;//根据以上的范围,将之连接起来,是一个四方的围,在这个范围内的touch,定义为中心点击if((x>min_center_x&&x<max_center_x)&&(y>min_center_y&&y<max_center_y)){//在围内Log.e(tag, "中间区域:x:"+x+" y:"+y);return ResultStatus.CENTER;}else if(x<center_x&&y<center_y){//不在围内Log.e(tag, "左上区域:x:"+x+" y:"+y);return ResultStatus.UP;}else if (x>center_x&&y<center_y) {//不在围内Log.e(tag, "右上区域:x:"+x+" y:"+y);return ResultStatus.UP;}else if (x>center_x&&y>center_y) {//不在围内Log.e(tag, "右下区域:x:"+x+" y:"+y);return ResultStatus.DOWN;}else if (x<center_x&&y>center_y) {//不在围内Log.e(tag, "左下区域:x:"+x+" y:"+y);return ResultStatus.DOWN;}else {Log.e(tag, "未知区域:x:"+x+" y:"+y);return null;}}
}
根据以上的代码我们可以实现点击不同的区域做不同的操作。这样在接口的实现中加入一些代码,看效果:
package com.example.androiddetector_csdn;import android.content.Context;
import android.util.Log;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;public class GuestureImp implements OnGestureListener{Context context;View view;String tag="me";String firstString="秦霸先,他是英雄的典范,武当派出身,早早习练“纯阳功”。文武双全,年轻时又名秦策,道号元冲,此人文武全才,当世英豪。二十四岁因一女子反出武当,自赴西北,后练成天山武学,自称天下无敌。二十六岁中状元,改名霸先。 因身为状元却又武艺渊深(“只手便举起殿前石狮子,纵跃飞奔如常”),初时在朝中无亲无故。后受到武英帝赏识,与柳昂天平定也先有功,爵赐武德侯,官拜征西大都督,与柳昂天并称“西霸先、北昂天”。武英十五年,武英帝御驾亲征失败,他将武英帝藏入神机洞中,反遭奸人陷害,一家老小几灭满门,被迫率三万将士造反,创立怒苍山,立忠义堂,聚天下群豪,与景泰朝廷大战十四年,后接受招安,惨死神鬼亭。传下“戊辰岁终,龙皇动世,天机犹真,神鬼自在”四句偈语,与一张羊皮一起被称为关系天下气运。";String secondString="卢云,山东潍县人,自幼父母双亡,苦读自学,学得一身经世致用的好学问,却不幸屡试不第,沦落到靠做酒肆店伙为生。在做酒肆店伙时为当地地痞陷害,又被贪官诬指为杀人犯,旦夕将死,适逢怒苍山残党(太湖双龙寨)劫狱救人,才得以脱困而出。逃狱之后,卢云以拉纤为业,顺运河而下直至扬州,在扬州入景泰朝大臣顾嗣源家为僮仆,后于一偶然机会(对联)为顾所赏识,被网罗为顾府幕僚,嗣源独生女顾倩兮亦对卢云深有好感。同时,卢云并获得了武当派的练气之法,以及怒苍山残党陆孤瞻的拳法传授,结合两者,在武艺上自创无绝心法,后遂成武林心体气术势五大宗中(练)气一派的大师。";String thirdString="杨肃观,杨远之子,面目俊俏,玉树临风,心机深沉,贵气逼人,潜龙的养子或亲生子,少林天绝传人,英雄志中身世最神秘的人。心地像神佛一样柔软的人,却承担了太多人的期望,以至于肩负了整个天下。作为替罪羔羊,历经猜疑磨难,已经心碎,终于当断则断,杀出重围,建立“镇国铁卫”,一举缔造佛国。身负“天诀”,手握“神剑”,驭“六道轮回”,一生费尽机心,以铁血平天下,自比修罗王,由佛入魔。其才天下无匹,其机心,直逼潜龙,其胸怀野心,更始吞吐天下。但是也因此毁情灭欲,罪恶滔天。佛说,我不如地狱,谁入地狱。杨肃观以一人入魔求天下太平,虽然灭绝人性,但仍不失为上上人物。";public GuestureImp(Context ct,View vw) {// TODO Auto-generated constructor stubcontext=ct;view=vw;}@Overridepublic boolean onDown(MotionEvent arg0) {// TODO Auto-generated method stubLog.e(tag, "down-"+"x:"+arg0.getX()+"y:"+arg0.getY());MatchXY matchXY=new MatchXY(context,view);ResultStatus resultStatus= matchXY.GetWhereAreYou(arg0.getX(),arg0.getY());if(resultStatus.equals(ResultStatus.UP)){((TextView)view).setText(firstString);}else if(resultStatus.equals(ResultStatus.DOWN)){((TextView)view).setText(secondString);}else if(resultStatus.equals(ResultStatus.CENTER)){((TextView)view).setText(thirdString);}return true;}@Overridepublic boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {// TODO Auto-generated method stubint mini_width=120;int mini_speed=0;float distance_right=arg1.getX()-arg0.getX();float distance_left=arg0.getX()-arg1.getX();float distance_down=arg1.getY()-arg0.getY();float distance_up=arg0.getY()-arg1.getY();if(distance_right>mini_width && Math.abs(arg2)>mini_speed){Log.e(tag, "onFling-"+"向右滑动");}else if(distance_left>mini_width && Math.abs(arg2)>mini_speed){Log.e(tag, "onFling-"+"向左滑动");}else if(distance_down>mini_width && Math.abs(arg2)>mini_speed){Log.e(tag, "onFling-"+"向下滑动");}else if(distance_up>mini_width && Math.abs(arg2)>mini_speed){Log.e(tag, "onFling-"+"向上滑动");}return true;}@Overridepublic void onLongPress(MotionEvent arg0) {// TODO Auto-generated method stubLog.e(tag, "onLongPress-"+"x:"+arg0.getX()+"y:"+arg0.getY());}@Overridepublic boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {// TODO Auto-generated method stubLog.e(tag, "onScroll-"+"x:"+arg0.getX()+"y:"+arg0.getY());return false;}@Overridepublic void onShowPress(MotionEvent arg0) {// TODO Auto-generated method stubLog.e(tag, "onShowPress-"+"x:"+arg0.getX()+"y:"+arg0.getY());}@Overridepublic boolean onSingleTapUp(MotionEvent arg0) {// TODO Auto-generated method stubLog.e(tag, "onSingleTapUp-"+"x:"+arg0.getX()+"y:"+arg0.getY());return false;}}
效果如下:
点击不同区域,textview中内容发生变化,简易版本翻译实现。
源码
Android手势识别——上下左右滑动、屏幕上下左右中区域处理相关推荐
- Android可上下左右滑动的列表
前言: 最开始使用的HorizontalScrollView和ListView当数据量上去之后发现有些低性能的手机变得卡顿,手机屏幕刷新会黑屏(黑平的时候我都惊呆了) 实现 废话不多说了接下来实现功能 ...
- android 可以上下左右滑动的界面布局
1.我使用的是ScrollView嵌套HorizontalScrollView让ScrollView负责上下滑动HorizontalScrollView负责左右滑动 2.以下代码提供了思路和完成手段, ...
- Android上下左右滑动,显示底层布局
转载博客地址:http://www.cnblogs.com/flyme2012/p/4106308.html 闲着没事做了一个小东西.Android的上下左右滑动,显示底层布局.可以做类似于QQ消息列 ...
- Android 可滑动表格的简单实现(类似于excel表格,支持上下左右滑动)
前言 最近遇到一个需求,以表格的形式模拟样本盒的显示,最初设想是利用RecyclerView网格形式实现,然而需求是盒子行列数目不固定,可能存在手机屏幕一屏显示不下的情况,因此需要做成可以上下左右滑动 ...
- android 手势识别 (缩放 单指滑动 多指滑动)
Android P 手势识别 1.前提介绍: 2.单指相关 2.双指缩放 3.多指滑动. 4.总体识别代码 1.前提介绍: 关于Android 手势识别就是当前view 根据用户的不同touch行为, ...
- android自动滑屏解锁,如何删除/绕过滑动屏幕以解锁Android设备-万兴恢复专家
如今,几乎所有数字设备都启用了安全模式,我们的智能手机就是这种情况.此类实例高度计划用于锁定我们的消息,图库,电子邮件和其他个人存储.使用锁定模式增强了安全性,因此,除了设备的已知用户之外,未知的人无 ...
- Android中实现滑动翻页—使用ViewFlipper
有一些场景,我们需要向用户展示一系列的页面.比如我们正在开发一个看漫画的应用,可能就需要向用户展示一张一张的漫画图片,用户使用手指滑动屏幕,可以在前一幅漫画和后一幅漫画之间切换.这个时候ViewFli ...
- Java-Appium封装实现滑动屏幕效果
** Java-Appium封装实现滑动屏幕效果 1.在客户端自动化测试过程中常常需要滑动屏幕,常见做法是自己手动传入xy滑动屏幕,一般是通过手机屏幕的大小进行一些计算后实现上下左右滑动,在一个屏幕中 ...
- java 滑块控制图片渐变切换_Android实现滑动屏幕切换图片
本文实例为大家分享了Android实现滑动屏幕切换图片的具体代码,供大家参考,具体内容如下 activity_main.xml 文件代码: xmlns:app="http://schemas ...
最新文章
- SDwebimage使用原理(转载)
- Apache Jackrabbit源码研究(五)
- 【深度思考】javaweb框架技术心得
- C语言中的选择法排序怎么,请问高手们 C语言中选择法排序和冒泡法排序的思想,两种方法有何不同,搞不懂,请举例详细说明一下.谢谢。...
- linux入门级知识回顾
- java guava 使用_Java8-Guava实战示例
- zblog php搜索页面,Z-Blog PHP实现搜索分页
- 【APICloud系列|12】ios真机调试时如何添加新设备的udid?
- java减治法深度优先查找_排序|减治法实现排序
- nginx php 没认,NginX没有执行PHP
- 浅谈互联网那些防不胜防的人肉搜索技巧
- 画质速度通吃 浅谈为游戏而生的SM3技术(Dx9的一些技术) -ok
- STM8系列芯使用STVP烧写程序设定读保护和如何解除读保护操作
- NLTK的安装/对象/词库/分词/词性标注/分块
- 写代码的时候图片显示不出来怎么办?
- WiFi测试规范总结
- 手机怎样设置一个高考倒计时便签,可以天天看见那种
- 关于程序员找工作的最好渠道,你可能听都没听过!
- UnityRPG第三人称控制器
- 视频文件格式分析(1):avi格式
热门文章
- 二十八、动词不定式 2 做表语、宾语、后置定语、状语
- pgSQL查询语句ERROR: relation “XXX“ does not exist
- JAVA实现QQ:实现文字聊天、QQ用户登录、拉取在线用户列表、无异常退出、私聊、发文件、下载文件、离线留言、服务端推送新闻等功能(后端无界面,Utilty源码在后面、)
- String的方法介绍以及实现
- 研究生如何进行文献检索和文献阅读
- c语言两个for语句并列执行_C语言for循环(for语句)详解
- 陆奇谈世界新格局下的创业创新机会:惠人达己,守正出奇
- 常用连续型随机变量的概率分布表(附概率密度函数全域积分等于1、期望、方差的推导与证明)
- 探秘前端 CRDT 实时协作库 Yjs 工程实现
- Python3中的多态 ,鸭子类型