最近项目中需要实现手势上滑或者点击滑出界面的效果,实现上是利用GestureDetector,然后在onFling中判断,但遇到一个问题:手势上滑是针对整个布局的,但如果有对单独的View设置点击监听,在该View上的手势上滑会失效。

如果这个View本身就是专门用于点击的,那并没有什么问题,可惜的是,这个View的尺寸不大,所以要求扩大点击区域。

我们首先能想到的方法就是用一个容器将该View包起来,类似RelativeLayout,LinearLayout等,但这样布局的层级就会再加多一层。

我们能否想到不用增加层级也能实现点击区域扩大的方法呢?

GestureDetector是Android提供的手势操作类,它提供了单击,双击,长按等操作,并且会将这些事件传给onTouch,因此我们可以利用这个来判断触发单击事件的到底是哪个控件。

但是我们的问题是扩大点击区域,而不是识别控件,因此需要知道用户的点击动作到底是落在哪个区域。

所幸,MotionEvent提供了事件发生时候的坐标,这样我们就能知道单击时候的坐标,进一步确定是否在指定的区域范围内。

MotionEvent是Android中触控方面编码的一个至关重要的类,它提供了用户在屏幕上的触控信息。我们可以通过MotionEvent获取到触控的事件类型,触控的坐标,并且现在已经支持多点触碰,还能进一步获取触控的索引信息。

我们先上代码:

     @Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
int downX = (int)event.getX();
int[] location = new int[2];
ivMore.getLocationInWindow(location);
if(Math.abs(downX - location[0]) <= 50){
...
}
}
return gestureDetector.onTouchEvent(event);
}

我们先通过MotionEvent的getAction,获取到触控的事件类型,单击的类型为ACTION_DOWN,然后通过MotionEvent的getX获取到点击的x坐标,然后通过getLocationInWindow获取指定的View的坐标,这里指定该组件的x轴坐标正负50(表示左右范围)内为触发范围。

我们现在可以不增加布局层级也能扩大点击范围了。

利用GestureDetector实现上滑判断是很简单的,只要实现OnGestureListener接口,在对应的回调中进行我们指定的操作,不过因为GestureDetector本身并不捕获触控事件,所以要再实现onTouch事件,并调用GestureDetector的onTouchEvent,将对应的事件传过去。

滑动的操作是在onFling回调中进行的,该回调会传进两个历史记录的MotionEvent,我们只要判断它们的Y轴坐标是否有变化即可。

Android的触控是一个相当大的话题范围,我们只要在明确自己需求的前提上,去寻找对应的快捷解决方案。

Android上滑手势触发和不增加布局层级扩大点击区域的更多相关文章

  1. Android 上滑上拉菜单SlidingDrawer 不全屏显示的方法

    这里来说一个已经被废弃的SlidingDrawer.. 他可以实现上拉,下拉的菜单. 但是有个问题就是上拉以后,是全屏显示的. 首先 写一个布局: <RelativeLayout xmlns:a ...

  2. 自学Android的第一个小程序(小布局、button点击事件、toast弹出)

    因为上班,学习时间有限,昨晚才根据教程写了一个小程序,今天忙里偷闲写一下如何实现的,来加深一下印象. 首先创建一个Android项目, 通过activity_xxx.xml布局文件来添加组件来达到自己 ...

  3. iOS 增加UIButton按钮的可点击区域

    在很多时候,按钮可能看起来那么大,但是在它周围进行点击时,都能够触发事件,是因为它的可点击区域比我们看到的button要大. 在使用AutoLayout的时候,我们处理的是按钮的image属性,所以这 ...

  4. js监听事件 上滑消失下滑出现的效果 触摸与手势事件

    https://www.w3cmm.com/javascript/touch.html //触摸与手势事件连接tinyscrollbar //方法1var _this = $('#fabu');var ...

  5. Android之MaterialDesign应用技术2-仿支付宝上滑搜索框缓慢消失

    PS:在这之前也就是上一篇介绍了MaterialDesign一些滑动删除.标题栏的悬浮效果等,如果没看过第一篇的小火鸡可以看一下,因为这篇是接着上一篇写的,有一些东西上一篇写过了这里就不在重复了(Ma ...

  6. Android的ListView分页功能(上滑加载更多)

    今天主要工作是将之前实现的各种ListView显示全部信息,优化成了每次加载几条数据,然后上滑的时候加载更多,底部显示一个进度条和一个文字提示,然后加载完毕后,将提示信息隐藏. 一边看教学视频一遍敲代 ...

  7. Android如何定制一个下拉刷新,上滑加载更多的容器

    前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉 ...

  8. Android 浮动按钮+上滑隐藏按钮+下滑显示按钮

    1.效果演示 1.1.关注这个红色的浮动按钮 . 可以看到,上滑的时候浮动按钮消失,因为用户迫切想知道下面的东西,而不是回到顶部. 当下滑的时候,用户想回到原来的位置,就可以点击浮动按钮,快速回到顶部 ...

  9. Android基本功:手势

    一.概念 手势:其实是指用户手指或触摸笔在屏幕上的连续触碰行为,Andoird对两种手势行为都提供了支持: Andorid提供了手势检测,并为手势检测提供了相应的监听器: Android允许开发者添加 ...

随机推荐

  1. 2013-08-12【随笔2】-Roy

    最近总是因为一下小事情,就会变得闹心,就会自己胡思乱想,自己吓唬自己,自己给自己找烦恼. 是因为每天无所事事,日子过得没有了重点,然后每天人心惶惶,有点杞人忧天了. 还是因为这样平淡的日子,消磨了我们 ...

  2. Android度量单位说明(DIP,DP,PX,SP) (转帖)

    (一)概念 dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...

  3. Twitter全局唯一ID生成算法

    测试:private static void TestIdWorker() { HashSet<long> set = new HashSet<long>(); IdWorke ...

  4. 使用curl 下载HTML

    简单的一个curl小例子: #include <iostream> #include <string> #include <sstream> #include &l ...

  5. Java语法糖4:内部类

    内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...

  6. Web前端技术研究:Css hack技术---令人沮丧的技术

    我最近想好好整理下csshack技术,但是结果很沮丧,下面我将我最初写的笔记和大家分享下. 我在单位整理的研究笔记: 不同的浏览器对某些CSS代码解析会存在一定的差异,因此就会导致不同浏览器下给用户展 ...

  7. 微信自定义分享到朋友圈API

    <script src="http://s0.qhimg.com/!249ce048/WeixinApi.js" type="text/javascript&quo ...

  8. FB引擎系列-之CloudSand

    CloudSand,欲打破之前的集中版本制作的模式, http://code.taobao.org/p/cloudsand包含服务器端代码(php)和客户端代码(unity)   EasyDown的时 ...

  9. i++ and ++i efficiency

    其实这个问题,百度的话,有一大堆的参考资料,但是,在这里,我产生了一些困惑,他们所分析的结果,和我的测试代码不一致,这让我纠结了,所以,再次的写一下这个问题,顺顺思路. 我的测试环境:系统:Windo ...

  10. 大叔也说Xamarin~Android篇~调用远程API接口,发POST请求

    回到目录 Xamarin我们在上节已经教大家如何去部署它的环境了,今天来说一个实际的例子,使用android客户调用.net web api的一个接口,并发送POST请求,当服务端回到请求后做出响应, ...