在Android中区分点击和滑动操作
转自:http://blog.csdn.net/do168/article/details/51587933
最近在写一个图片浏览安卓应用,想要弄成全屏显示,只在单击时显示工具栏和状态栏,在触摸滑动时翻页。经过几个小时在互联网上的搜索也没找到合适的例子。
知道Android Studio的模板里有一个全屏的模板,于是使用android studio中的全屏模板新建了一个工程,启动测试了一下。应用启动时就自动隐藏了工具栏和状态栏,点击屏幕后会重新显示出来,正是我所需要的。哇,真不错。
但也有问题,触摸滑动和点击居然不分家,最终都会触发点击事件。这该怎么办呢?研究了一下setOnTouchListener事件,发现该事件最后的返回值可以影响是否还会执行后面的点击事件。也就是返回true不执行后面的事件,返回false则继续执行后面的事件。
于是写了下面的代码,来区分用户的操作意图,从页触发不同的事件。
1 private static float DownX = 0; 2 private static float DownY = 0; 3 private static float moveX = 0; 4 private static float moveY = 0; 5 private static long currentMS = 0; 6 7 。。。。。。 8 9 mContentView.setOnTouchListener(new View.OnTouchListener() { 10 @Override 11 public boolean onTouch(View v, MotionEvent event) { 12 switch (event.getAction()) { 13 case MotionEvent.ACTION_DOWN: 14 DownX = event.getX();//float DownX 15 DownY = event.getY();//float DownY 16 moveX = 0; 17 moveY = 0; 18 currentMS = System.currentTimeMillis();//long currentMS 获取系统时间 19 break; 20 case MotionEvent.ACTION_MOVE: 21 moveX += Math.abs(event.getX() - DownX);//X轴距离 22 moveY += Math.abs(event.getY() - DownY);//y轴距离 23 DownX = event.getX(); 24 DownY = event.getY(); 25 break; 26 case MotionEvent.ACTION_UP: 27 long moveTime = System.currentTimeMillis() - currentMS;//移动时间 28 //判断是否继续传递信号 29 if(moveTime>200&&(moveX>20||moveY>20)){ 30 return true; //不再执行后面的事件,在这句前可写要执行的触摸相关代码。点击事件是发生在触摸弹起后 31 } 32 break; 33 } 34 return false;//继续执行后面的代码 35 } 36 });
上面的代码通过计算触摸时间和触摸期间移动的距离来判断用户的操作意图。
当触摸时间较长,并且移动了一定距离后,我们就断定发生了触摸滑动操作,并返回true,下再引发后面的事件;否则继续触发后面的点击事件。
我建了一个Git仓库,存放我尝试过的例子,完整 代码都放在那里。
https://code.csdn.NET/do168/androidtestcenter
欢迎下载