Android上滑手势触发和不增加布局层级扩大点击区域
最近项目中需要实现手势上滑或者点击滑出界面的效果,实现上是利用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上滑手势触发和不增加布局层级扩大点击区域的更多相关文章
- Android 上滑上拉菜单SlidingDrawer 不全屏显示的方法
这里来说一个已经被废弃的SlidingDrawer.. 他可以实现上拉,下拉的菜单. 但是有个问题就是上拉以后,是全屏显示的. 首先 写一个布局: <RelativeLayout xmlns:a ...
- 自学Android的第一个小程序(小布局、button点击事件、toast弹出)
因为上班,学习时间有限,昨晚才根据教程写了一个小程序,今天忙里偷闲写一下如何实现的,来加深一下印象. 首先创建一个Android项目, 通过activity_xxx.xml布局文件来添加组件来达到自己 ...
- iOS 增加UIButton按钮的可点击区域
在很多时候,按钮可能看起来那么大,但是在它周围进行点击时,都能够触发事件,是因为它的可点击区域比我们看到的button要大. 在使用AutoLayout的时候,我们处理的是按钮的image属性,所以这 ...
- js监听事件 上滑消失下滑出现的效果 触摸与手势事件
https://www.w3cmm.com/javascript/touch.html //触摸与手势事件连接tinyscrollbar //方法1var _this = $('#fabu');var ...
- Android之MaterialDesign应用技术2-仿支付宝上滑搜索框缓慢消失
PS:在这之前也就是上一篇介绍了MaterialDesign一些滑动删除.标题栏的悬浮效果等,如果没看过第一篇的小火鸡可以看一下,因为这篇是接着上一篇写的,有一些东西上一篇写过了这里就不在重复了(Ma ...
- Android的ListView分页功能(上滑加载更多)
今天主要工作是将之前实现的各种ListView显示全部信息,优化成了每次加载几条数据,然后上滑的时候加载更多,底部显示一个进度条和一个文字提示,然后加载完毕后,将提示信息隐藏. 一边看教学视频一遍敲代 ...
- Android如何定制一个下拉刷新,上滑加载更多的容器
前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉 ...
- Android 浮动按钮+上滑隐藏按钮+下滑显示按钮
1.效果演示 1.1.关注这个红色的浮动按钮 . 可以看到,上滑的时候浮动按钮消失,因为用户迫切想知道下面的东西,而不是回到顶部. 当下滑的时候,用户想回到原来的位置,就可以点击浮动按钮,快速回到顶部 ...
- Android基本功:手势
一.概念 手势:其实是指用户手指或触摸笔在屏幕上的连续触碰行为,Andoird对两种手势行为都提供了支持: Andorid提供了手势检测,并为手势检测提供了相应的监听器: Android允许开发者添加 ...
随机推荐
- Java学习笔记:控制反转
控制反转(Ioc)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在 ...
- javascript position兼容性随笔
一.Javascript源码 if (!window.jasen.core.Position) { window.jasen.core.Position = {}; } function Size(w ...
- Linux Kernel 3.11.4/3.10.15/3.4.65/3.0.99
Linux 今天又发布了4个更新版本,分别是: 3.11.4 2013-10-05 [tar.xz] [pgp] [patch] [view patch] [view inc] [cgit] [cha ...
- jquery选择器如何获取父级元素、同级元素、子元素
一.新建页面 <ul> <li>list item 1</li> <li>list item 2</li> <li class=&qu ...
- 【原创】GC/垃圾回收简介
GC简介 1 GC机制 1.1 对象 从计算机的角度,装有数据的内存空间 1.2 作用 将内存垃圾的释放自动化 1.3 本质 将已经引用不到的对象视为死亡,将死亡的对象找出来并且作为垃圾进行回收 2 ...
- Wix 安装部署教程(九) --用WPF做安装界面
经常安装PC端的应用,特别是重装系统之后,大致分为两类.一类像QQ,搜狗输入法这样的.分三步走的:第一个页面可以自定义安装路径和软件许可.第二个页面显示安装进度条,第三个页面推荐其他应用.先不管人家怎 ...
- SQL Server内存理解的误区
SQL Server内存理解 内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求 ...
- 从Windows中卸载Apache
在重装Apache或者妳不再需要它的时候,这时就需要将它卸载. 下面是步骤: 打开开始菜单(win8中ÿ+X)或者我的电脑(废话) 找到并打开Apache的安装目录(Program Files\Apa ...
- 可拖动的DIV续
之前写过一篇可拖动的DIV讲如何实现可拖动的元素,最后提出了几点不足,这篇文章主要就是回答着三个问题 1. 浏览器兼容性 2. 边界检查 3. 拖动卡顿.失灵 先附上上次代码 <!DOCTYPE ...
- Git学习笔记(5)——分支管理
本文主要记录了分支的原理.分支的创建,删除,合并.以及分支的使用策略. 分支在实际中的作用 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不 ...