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。
,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,再传递到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方法。
也就是上面说的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
*/ private int OUT_CYCLE_NORMAL = Color.rgb(108, 119, 138); // ������Բ��ɫ private int OUT_CYCLE_ONTOUCH...= Color.rgb(025, 066, 103); // ѡ����Բ��ɫ private int INNER_CYCLE_ONTOUCH = Color.rgb(002, 210, 255)...(OUT_CYCLE_NORMAL); paintInnerCycle.setColor(INNER_CYCLE_ONTOUCH); paintLines.setColor(LINE_COLOR);...; } public void setOnTouch(boolean onTouch) { this.onTouch = onTouch; } public boolean isPointIn...* (y - oy)); return distance < r; } } 思路: 1.自定义一个 View和MyCircle类,将九个MyCircle类的实例绘制到View中. 2.处理onTouch
OnTouchListener() { int lastX, lastY; @Override public boolean onTouch...是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕) 如果你的某个Activity中实现OnTouchListener接口,需要重写onTouch...下面简单来讲讲onTouch和onTouchEvent的区别 onTouch:属于某个组件的OnTouchListener接口,点击组件有效 onTouchEvent:属于Activity,点击全屏幕有效
R.id.tv01); mTv1.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch...MotionEvent event) { double x=event.getRawX(); double y=event.getRawY(); Log.d(TAG, "onTouch...MotionEvent.ACTION_MOVE){ double dx=x-lastx; double dy=y-lastY; Log.d(TAG, "onTouch...MotionEvent event) { // double x=event.getRawX(); // double y=event.getRawY(); // Log.d(TAG, "onTouch...MotionEvent.ACTION_MOVE){ // double dx=x-lastx; // double dy=y-lastY; // Log.d(TAG, "onTouch
break; } return super.onTouchEvent(event); } } 定义一个MainActivity来展现这个MyTextView,同时设置点击(onClick)和触摸(onTouch...Log.i(tag, "MyTextView onClick"); break; } } // MyTextView 触碰事件 @Override public boolean onTouch...ACTION_UP"); break; case MotionEvent.ACTION_MOVE: Log.i(tag, "MyTextView onTouch ACTION_MOVE..."); break; case MotionEvent.ACTION_DOWN: Log.i(tag, "MyTextView onTouch ACTION_DOWN");...View 的事件控制顺序先执行 onTouch 再执行 onClick ,如果 onTouch 返回 true 消费,则不会继续传递,也不会执行 onClick 方法。
重写onTouch,在onTouch 里面判断点击点的颜色。 根据当前选择的颜色设置图片的src. 获取Bitmap 在 ColorPickerView 构造函数中初始化 Bitmap。..., 0, vectorCanvas.getWidth(), vectorCanvas.getHeight()); drawable.draw(vectorCanvas); } 重写onTouch...public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN...typeArray.getResourceId(i, 0); } typeArray.recycle(); } setOnTouchListener(this); } @Override public boolean onTouch
于是我使用 OnTouch事件来处理。于是我们必须搞懂OnTouch的运行机制。了解 请google it. 2.3. 列头 (显示列名的那一行)是固定的,不会上下滚动 。但可以左右滚动。...3.1, 捕获 列头(容器控件,包含固定和可滚动控件)的 onTouch事件(拖动事件),不处理。...捕获 数据行 区 的控件(该控件其实就是ListView控件 )的OnTouch事件,不处理,同样分发给 “列头里的 可滚动部分的控件”。
领取专属 10元无门槛券
手把手带您无忧上云