OnTouch关于performClick的Warning 当你对一个控件(例如FloatingActionButton)使用setOnTouchListener() 或者是对你的自定义控件重写onTouchEvent...可能意思还是不太明了,再说明一下:当你添加了一些点击操作,例如像setOnClickListener这样的,它会调用performClick才可以完成操作,但你重写了onTouch,就有可能把performClick...2 如果你在setOnTouchListener时遇到这个Warning,那么除了在控件内重写performClick()外,也需要在onTouch()中调用performClick(): button.setOnTouchListener...(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent
记得刚开始学习Android的时候,对于onTouch相关的事件一头雾水。...分不清onTouch(),onTouchEvent()和OnClick()之间的关系和先后顺序,觉得有必要搞清onTouch事件传递的原理。...所以View这个类应该掌管着onTouch事件的相关处理。...还剩最后一个:li.mOnTouchListener.onTouch(this, event),显然是回调了第二个判断中监听器的onTouch()方法,如果onTouch()方法返回true,则上面四个判断全部为...到了这里onTouch事件的传递机制基本已经分析完成了,也算是告一段落了。
问题来了,根据他说的,每次点击,总是先实现 自定义View的 onTouch 的down,然后是 onClick,而 父 Linearlayout的 onTouch是最后实现,而且,父的 action_down...他答:嗯,百度上有onClick和onTouch的冲突例子,但是全都是针对同一个 View的情况下,而且 无论onTouch返回false不阻断还是true阻断继续传送下去,都是无作用。 ...解决方法: 既然传统的解决方法解决不了,我当时想到的是: 1:子View 使用父类的 onTouch 接口来实现点击和改变颜色,总之就是子View不要自己再实现 onClick和onTouch...; 2:父View 实现个接口,供子View实现自己的onTouch内容; 3:当用户onTouch的时候,父View 在恰当的时候调用该接口,实现子View的请求的功能。...这样所会产生的问题: 因为它的这个父View是整个使用onTouch来实现下拉的,所以: 1:用户点击后会产生两次的 onTouch执行,一次是子 View,第二次是 父View。
因此事件传递的顺序是先经过onTouch,再传递到onClick。...细心的朋友应该可以注意到,onTouch方法是有返回值的,这里我们返回的是false,如果我们尝试把onTouch方法里的返回值改成true,再运行一次,结果如下: 我们发现,onClick方法不再执行了...你可以先理解成onTouch方法返回true就认为这个事件被onTouch消费掉了,因而不会再继续向下传递。...第三个条件就比较关键了,mOnTouchListener.onTouch(this, event),其实也就是去回调控件注册touch事件时的onTouch方法。...现在我们可以结合前面的例子来分析一下了,首先在dispatchTouchEvent中最先执行的就是onTouch方法,因此onTouch肯定是要优先于onClick执行的,也是印证了刚刚的打印结果。
可以看到,onTouch是优先于onClick执行的,并且onTouch执行了两次,一次是ACTION_DOWN,一次是ACTION_UP(你还可能会有多次ACTION_MOVE的执行,如果你手抖了一下...因此事件传递的顺序是先经过onTouch,再传递到onClick。...细心的朋友应该可以注意到,onTouch方法是有返回值的,这里我们返回的是false,如果我们尝试把onTouch方法里的返回值改成true,再运行一次,结果如下: ?...你可以先理解成onTouch方法返回true就认为这个事件被onTouch消费掉了,因而不会再继续向下传递。...第三个条件就比较关键了,mOnTouchListener.onTouch(this, event),其实也就是去回调控件注册touch事件时的onTouch方法。
,click事件,所涉及到的listener方法如下 以TextView为例,给textview添加listener: setOnTouchListener:覆写父接口OnTouchListener的onTouch...(View v, MotionEvent event) { Log.i(TAG,"----onTouch---"); switch (event.getAction())...break; case MotionEvent.ACTION_MOVE: Log.i(TAG,"---onTouch--ACTION_MOVE")...--- 05-18 23:09:31.840 1008-1008/com.fang.zrf.qrcodedemo I/MainActivity: ---onTouch--ACTION_UP 但是如果onTouch...--- 05-18 23:11:27.240 3810-3810/com.fang.zrf.qrcodedemo I/MainActivity: ---onTouch--ACTION_UP
也就是上面说的onTouch监听。...而默认的onTouch监听返回false,只要一个是false,就不会返回true。...如果dispatch***在执行onTouch监听的时候,onTouch返回了true,那么它也返回true,这个事件提前被onTouch消费掉了。...3、我们通常在onTouch监听了设置图片一旦被触摸就改变它的背景、透明度之类的,这个onTouch表示事件的时机。而在onClick监听了去具体干某些事。...这时候的父亲就像一个独立的孩子一样了(View),无官一身轻,再也不用管它的孩子了,可以正常onClick onTouch. 2、如果希望一个View只onTouch而不onClick,在onTouch
ENABLED //mOnTouchListener.onTouch是否返回true,根据onTouch方法是否返回为true有关 && li.mOnTouchListener.onTouch...如果在 onTouch 方法中通过返回 true 将事件消费掉,onTouchEvent 将不会再执行。...onTouch 执行需要满足两个条件: mOnTouchListener 的值不能为空 当前点击的控件必须是 enable 的。...因此如果你有一个控件是非 enable 的,那么给它注册 onTouch 事件将永远得不到 执行。...区别 onTouch事件要先于onClick事件执行,onTouch在事件分发方法dispatchTouchEvent中调用,而onClick在事件处理方法onTouchEvent中被调用,onTouchEvent
= new OnTouchListener() { int lastX, lastY; @Override public boolean onTouch...android:layout_alignBottom="@+id/imageView1"> 其中 在onTouch...对于onTouchEvent 中onTouch返回值 1 、如果return false 说明还没有消费onTouch事件,在执行onTouch里代码后,onTouch事件并没有结束。...2、如果return true 说明消费了onTouch事件 onTouch事件结束了 但在实际操作中 除了ACTION_DOWN事件以外,其余的事件只有返回true的那个方法才能捕捉到。
即回调控件注册Touch事件时的onTouch(); * 2....()返回false 注册Touch事件监听 且 在onTouch()返回true 分析1:注册Touch事件监听 且 在onTouch()返回false 代码示例 // 1....(), 动作是:0 执行了onTouch(), 动作是:1 执行了onClick() 测试结果说明 点击按钮会产生两个类型的事件-按下View与抬起View,所以会回调两次onTouch(); 因为onTouch...(), 动作是:0 执行了onTouch(), 动作是:1 测试结果说明 点击按钮会产生两个类型的事件-按下View与抬起View,所以会回调两次onTouch(); 因为onTouch()返回了true...()中调用 但onTouch()优先于onTouchEvent执行;若手动复写在onTouch()中返回true(即 将事件消费掉),将不会再执行onTouchEvent() 注:若1个控件不可点击(
https://github.com/2954722256/demo_event ---- 这里 我们给上一篇的2个例子, 只是在MainActivity中, 分别给2个控件, 添加上OnClick 和 OnTouch...dispatchTouchEvent ----> ACTION_DOWN ----> noMsg MainActivity ---- btn setOnTouchListener onTouch..., 再 获取到OnTouchEvent事件(系统的,消费) , 再触发 OnClick 事件 我们可以理解成, 点击事件从最外层分发下来, 先触发 TouchListener回调接口, 系统获得处理OnTouch...dispatchTouchEvent ----> ACTION_DOWN ----> noMsg MainActivity ---- LL setOnTouchListener onTouch...(系统的,消费) , 再触发 OnClick 事件 只是, ViewGroup没有调用最外面Activity的OnTouchEvent方法了 ** 可以理解成,这里消费掉了点击, 就不用调用上层的 OnTouch
}); } } 打印日志如下: 2020-02-08 16:09:51.594 11907-11907/com.aruba.touchapplication I/MyView: onTouch...I/MyView: onTouchEvent 0 2020-02-08 16:09:51.610 11907-11907/com.aruba.touchapplication I/MyView: onTouch...I/MyView: onTouchEvent 2 2020-02-08 16:09:51.637 11907-11907/com.aruba.touchapplication I/MyView: onTouch...I/MyView: onTouchEvent 2 2020-02-08 16:09:51.639 11907-11907/com.aruba.touchapplication I/MyView: onTouch...ACTION_UP = 1; public static final int ACTION_MOVE = 2; 所以一个控件触摸事件的顺序是先调用onTouch
我们看下onTouch和onClick,从参数都能看出来onTouch比onClick强大灵活,毕竟多了一个event参数。...如果你眼睛比较尖你会看见onTouch会有一个返回值,而且在上面返回了false。你可能会疑惑这个返回值有啥效果?那就验证一下吧,我们将上面的onTouch返回值改为ture。...,如果onTouch返回true则onClick不会被调运了。...控件触摸就会调运dispatchTouchEvent方法,而在dispatchTouchEvent中先执行的是onTouch方法,所以验证了实例结论总结中的onTouch优先于onClick执行道理。...如果控件是ENABLE且在onTouch方法里返回了true则dispatchTouchEvent方法也返回true,不会再继续往下执行;反之,onTouch返回false则会继续向下执行onTouchEvent
即回调控件注册Touch事件时的onTouch(); * 2\....()返回false 注册Touch事件监听 且 在onTouch()返回true 分析1:注册Touch事件监听 且 在onTouch()返回false 代码示例 // 1\....(), 动作是:0 执行了onTouch(), 动作是:1 执行了onClick() 测试结果说明 点击按钮会产生两个类型的事件-按下View与抬起View,所以会回调两次onTouch(); 因为onTouch...(), 动作是:0 执行了onTouch(), 动作是:1 测试结果说明 点击按钮会产生两个类型的事件-按下View与抬起View,所以会回调两次onTouch(); 因为onTouch()返回了true...() 注:若1个控件不可点击(即非enable),那么给它注册onTouch事件将永远得不到执行,具体原因看如下代码 // &&为短路与,即如果前面条件为false,将不再往下执行 // 故:onTouch
OnTouchListener() { int lastX, lastY; @Override public boolean onTouch...是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕) 如果你的某个Activity中实现OnTouchListener接口,需要重写onTouch...下面简单来讲讲onTouch和onTouchEvent的区别 onTouch:属于某个组件的OnTouchListener接口,点击组件有效 onTouchEvent:属于Activity,点击全屏幕有效
ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.e(TAG, "onTouch ...ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.e(TAG, "onTouch ACTION_UP... 06:09:39.232: E/MyButton(879): dispatchTouchEvent ACTION_UP 08-31 06:09:39.248: E/MyButton(879): onTouch...= null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this, ... ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.e(TAG, "onTouch
于是我使用 OnTouch事件来处理。于是我们必须搞懂OnTouch的运行机制。了解 请google it. 2.3. 列头 (显示列名的那一行)是固定的,不会上下滚动 。但可以左右滚动。...3.1, 捕获 列头(容器控件,包含固定和可滚动控件)的 onTouch事件(拖动事件),不处理。...捕获 数据行 区 的控件(该控件其实就是ListView控件 )的OnTouch事件,不处理,同样分发给 “列头里的 可滚动部分的控件”。
每到一个子view,看他的onInterceptTouchEvent 方法是否拦截,ontouch是否消费方法,如果没有继续向下dispatchTouchEvent分发事件,都不处理向上传,当回到顶级,...= null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this,...onTouchEvent(event); } } 当以下三个条件任意一个不成立时 mOnTouchListener不为null view是enable的状态 mOnTouchListener.onTouch...在这里我们可以看到,首先执行的是mOnTouchListener.onTouch的方法,然后是onTouchEvent方法继续追溯源码,到onTouchEvent()观察,发现在处理ACTION_UP事件里有这么一段代码...mPerformClick)) { performClick(); } 此时可知,onClick方法也在最后得到了执行所以三者的顺序是: setOnTouchListener() 的onTouch
1.4 onTouch 是触摸事件,当一个触摸事件被分发到一个view的时候。...1.6 onClick 是一个点击事件,是在onTouchEvent的up事件里面执行的,它的优先级是最低,如果在onTouchEvent或OnTouchListener的onTouch方法如果返回true...onTouch,onTouchEvent和onClick的执行顺序:onTouch—>onTouchEvent—>onClick,注意:onClick直接消费掉了事件,不会再向上回溯事件了。...,而且事件也不再传递到子View 4.那如果我们不想让TextView的点击事件响应怎么办,按照上面的andorid事件分发流程图,方法多了,我们可以在不同的阶段进行控制,不让事件向下分发,但我们试试onTouch...测试结果是可以的,也就是说onTouch()方法返回true也是自己消费了,不会在向下传递到onTouchEvent()了,更不会传递到onClick()了,如图: ? image.png ?
view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch...: View--->onTouch"); } return false; } });...= null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch...如果设置了OnTouchListener,并且当前 View 可点击,就调用监听器的 onTouch 方法, 如果 onTouch 方法返回值为 true,就设置 result 为 true。...那他将不执行任何事件,包括ontouch。 4.如果view的ontouch消耗了事件,他不再执行任何点击事件。
领取专属 10元无门槛券
手把手带您无忧上云