技术标签: android 触摸监听重写
Android不同层次的触摸事件监听
APP开发中,经常会遇到有关手势处理的操作,比如向右滑动返回上一个页面。关于触摸事件的处理,我们可以大概处理在不同的层次上。
Activity层:可以看做触摸事件获取的最顶层
ViewGroup层:ViewGroup层可以自主控制是否让子View获取触摸事件
View层:可以决定自己是否真正的消费触摸事件,如果不消费抛给上层ViewGroup
Activity级别的手势监听:(右滑动返回上层界面)
Activity层手势监听的使用场景:一般用于当前页面中没有过多的手势需要处理的时候,至多存在点击事件。对于右滑返回上层界面这种需求,可以将其定义在一个BaseActivity中,子Activity如果需要实现,通过某个开关打开即可。
注意事项 :
1、Activity层,用dispatch可以抓取所有的事件 。
2、对于滑动,要设定一个距离阈值mDistanceGat,用于标记手势是否有效,并且注意往回滑动的处理。
3、如果底层存在点击Item,为了防止滑动过程中变色,可以适时地屏蔽触摸事件:手动构造Cancle事件主动下发,这是为了兼容最基本的点击效果,不过,满足点击的手势判定前, Move事件要正常下发。具体实现如下:
@Override
public boolean dispatchTouchEvent(MotionEvent event) { case MotionEvent.ACTION_MOVE:
if (Math.abs(event.getX() - down_X) > 10
&& flagDirection == MotionDirection.HORIZION) {
MotionEvent e = MotionEvent.obtain(event.getEventTime(),
event.getEventTime(),
MotionEvent.ACTION_CANCEL,
event.getX(),
event.getY(), 0);
super.dispatchTouchEvent(e);
} else {
super.dispatchTouchEvent(event);//不符合条件正常下发
}
4、防止手势的往回滑动,最好利用GestureDectetor来判断,如果存在往回滑动,则手势无效,使用方式如下:
mDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (!slideReturnFlag && distanceX > 5) {
slideReturnFlag = true;
}}
5、如何处理Up事件:dispatch是否往下派发。具体的做法是,根据手势是否有效,如果手势无效,那么Up肯定是需要往下派发的。如果有效,根据后续操作进行,因为有时候为了防止子View获取到不必要的点击事件。具体实现如下
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
case MotionEvent.ACTION_UP:
if (mGestureListener != null && !slideReturnFlag
&& flagDirection == MotionDirection.HORIZION) {
if (stateMotion == CurrentMotio
文章浏览阅读1.3k次。贪心算法的两个重要因素:_贪心算法无后效性
文章浏览阅读3.7k次,点赞6次,收藏19次。Mobile APP(Apple IOS app store)特性分析一、数据来源、分析目的和思路 1. 数据来源 IOS占据将近一半的智能手机市场,其App Store中有大量App,为了分析App特性,从Kaggle中找到一个相关数据集: (https://www.kaggle.com/ramamet4/app-store-apple-data-set-10k-apps/home) ..._cont_rating
文章浏览阅读470次。Counter 1-12题目:使用下面的输出设计一个1-12的计数器。1、Reset 同步高电平复位,复位之后计数器为1;2、Enable为高电平计数器开始运行;3、Clk 上升沿有效;4、Q[3:0]作为计数器的输出;5、c_enable,c_load,c_d[3:0] 由4-bit计数器提供的控制信号,这样可以验证操作的正确性;你可以使用下面的组件:4-bit计数器,带有Enable使能和同步parallel-load输入的信号。(load的优先级要高于enable)。这个count4模_c_enable、c_load c_d[3:0]
文章浏览阅读3.3w次,点赞178次,收藏423次。简介 ConcurrenHashMap 在扩容过程中主要使用 sizeCtl 和 transferIndex 这两个属性来协调多线程之间的并发操作,并且在扩容过程中大部分数据依旧可以做到访问不阻塞,具体是如何实现的,请继续 。说明:该源码来自于 jdk_1.8.0_162 版本 。特别说明:不想看源码可直接跳到后面直接看图解 。一、sizeCtl 属性..._concurrenthashmap1.8的扩容机制
文章浏览阅读2.6k次,点赞3次,收藏10次。点击下方“AI算法与图像处理”,一起进步!重磅干货,第一时间送达码字不易,给打工人点个赞吧。今天分享一篇南洋理工大学&商汤科技的最新论文:Focal Frequency Lo..._focal frequency loss
文章浏览阅读197次。题目http://acm.hdu.edu.cn/showproblem.php?pid=1232代码#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int MAXN=1e3 + 100;int pre[MAXN],a[M..._并查集 kk17
文章浏览阅读3k次,点赞2次,收藏4次。PC Simulator 配置视频教程:How to Run Littlev Graphics Library in PC Simulator (Linux)PC simulatorYou can try out the Littlev Graphics Library using only your PC without any development board. Write a ..._esp sdl2
文章浏览阅读1.6k次。static像在VB,C,C++,Java中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、PROLOG、Ada等语言中也是有出现的,只是有着不同的作用,对于其具体作用,读者有需要的时候是可以具体查阅的鉴于时间问题今天我就不一一罗列了。C++中的static简介C#与C+..._vb 释放静态变量
文章浏览阅读293次。进程间测通信 --eventfd最近在学习多线程网络库muduo时,新学了一种新的进程通信方法eventfd。它是从LINUX 2.6.27版本开始增加的,主要用于进程或者线程间的通信(如通知/等待机制的实现)。我们知道,在进行IO多路复用的时候,比如select、poll、epoll等,线程会阻塞在这些监听函数上面。有时候,我们需要在没有监听事件到来时,将线程从阻塞的监听函数中唤醒。常用的唤醒方法是:建立一个管道,将管道的一端置于监听函数上,当我们想要唤醒线程时,像管道的另一端写入数据。even_eventfd epoll poll select inotify
文章浏览阅读9.9k次,点赞4次,收藏3次。文章目录1.`joining()`方法说明2.使用`Collectors.joining()`方法拼接包含`String`类型的`List`2.使用`Collectors.joining()`方法拼接包含`Object`类型的`List`参考文献在本页中,我们将提供java 8 Collectors joining()示例。方法返回收集器实例。它按顺序连接输入元素。我们也可以在元素连接中传递分隔符、前缀和后缀。1.joining()方法说明假设我们用以下方式收集元素A、B、C、D。①joining_collectors.joining()
文章浏览阅读76次。整理一下自己的学习Aaron Saray 写的PHP设计模式一些demo和自己的理解。大佬看完如果发现鄙人理解有误请立即指出,感谢拍砖,跪求鞭打/*** DAO (Data Access Objects) 数据访问对象* -------------------------------------* ** 来自说明 **** 数据访问对象设计模式描述了如何创建提供透明访问任何数据源的对象** 目的..._php设计模式dao
文章浏览阅读419次。剑指Offer面试题6:重建二叉树(JS实现)题目描述:输入某二叉树的前序遍历和中序遍历,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。例如,前序遍历序列:{1,2,3,7,3,5,6,8},中序遍历序列:{4,7,2,1,5,3,8,6} var Node = function(key) { this.key = key; this_已知二叉树的前序遍历是abdgcefh,中序遍历序列为,请重建该二叉树,并按照前