Android View的onTouchEvent和OnTouch区别
还是以自定义的TestButton为例。
我们可以通过重写onTouchEvent方法来处理诸如down move up的消息:
- public class TestButton extends Button {
- public TestButton(Context context) {
- super(context);
- // TODO Auto-generated constructor stub
- }
- public TestButton(Context context, AttributeSet attributeSet) {
- super(context, attributeSet);
- // TODO Auto-generated constructor stub
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- boolean value = super.onTouchEvent(event);
- System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());
- return value;
- }

public class TestButton extends Button {
public TestButton(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public TestButton(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean value = super.onTouchEvent(event);
System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());
return value;
}
也可以通过实现OnTouchListener的接口,然后设置TestButton的onTouchListener可以达到同样的目的
- class OnTouchListenerTest implements View.OnTouchListener{
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- return false;
- }
- }

class OnTouchListenerTest implements View.OnTouchListener{
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
}
- TestButton b = (TestButton)findViewById(R.id.button);
- OnTouchListenerTest listener = new OnTouchListenerTest();
- b.setOnTouchListener(listener);

TestButton b = (TestButton)findViewById(R.id.button);
OnTouchListenerTest listener = new OnTouchListenerTest();
b.setOnTouchListener(listener);
但上述两种监听有什么区别呢?
先看一下Android源码中对于View中dispatchTouchEvent的实现:
- public boolean dispatchTouchEvent(MotionEvent event){
- ... ...
- if(onFilterTouchEventForSecurity(event)){
- ListenerInfo li = mListenerInfo;
- if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
- && li.mOnTouchListener.onTouch(this, event)) {
- return true;
- }
- if(onTouchEvent(event)){
- return true;
- }
- }
- ... ...
- return false;
- }

//源码:
public boolean dispatchTouchEvent(MotionEvent event){
... ...
if(onFilterTouchEventForSecurity(event)){
ListenerInfo li = mListenerInfo;
if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
return true;
}
if(onTouchEvent(event)){
return true;
}
}
... ...
return false;
}
可以看到onTouchListener的接口的优先级是要高于onTouchEvent的,假若onTouchListener中的onTouch方法返回true,
表示此次事件已经被消费了,那onTouchEvent是接收不到消息的。
因为Button的performClick是利用onTouchEvent实现,假若onTouchEvent没有被调用到,那么Button的Click事件也无法响应。
综合来讲:
onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
假如onTouch方法返回false会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。
//------------布局文件--------------------
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent" tools:context="myontouch.bwie.com.myontouch.MainActivity"> <myontouch.bwie.com.myontouch.TestButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击"
android:id="@+id/button"/>
</RelativeLayout> //--------------自定义TextButton--------------------------
public class TestButton extends Button{
public TestButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TestButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean value = super.onTouchEvent(event);
System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());
Log.i("我是onTouchEvent","onTouchEvent");
return value;
}
}
//----------------主Activity-------------
public class MainActivity extends AppCompatActivity {
private TestButton button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
button = (TestButton) findViewById(R.id.button);
OnTouchListenerTest listener = new OnTouchListenerTest();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("我是OnClickListener","OnClickListener");
}
});
button.setOnTouchListener(listener);
}
class OnTouchListenerTest implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("我是onTouch","onTouch");
return false;
}
}
//---------------下面是我的OnTouch 返回false 时,的打印----------
12-14 13:52:51.550 8752-8752/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 13:52:51.553 8752-8752/myontouch.bwie.com.myontouch I/System.out: super.onTouchEvent: true event: 0
12-14 13:52:51.554 8752-8752/myontouch.bwie.com.myontouch I/我是onTouchEvent: onTouchEvent
12-14 13:52:51.565 8752-8752/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 13:52:51.566 8752-8752/myontouch.bwie.com.myontouch I/System.out: super.onTouchEvent: true event: 2
12-14 13:52:51.566 8752-8752/myontouch.bwie.com.myontouch I/我是onTouchEvent: onTouchEvent
12-14 13:52:51.649 8752-8752/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 13:52:51.649 8752-8752/myontouch.bwie.com.myontouch I/System.out: super.onTouchEvent: true event: 1
12-14 13:52:51.649 8752-8752/myontouch.bwie.com.myontouch I/我是onTouchEvent: onTouchEvent
12-14 13:52:51.656 8752-8752/myontouch.bwie.com.myontouch I/我是OnClickListener: OnClickListener
//-------------------下面是 onTouch 返回 true时的打印-------------------------
12-14 14:03:33.399 19886-19886/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 14:03:33.415 19886-19886/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
12-14 14:03:33.429 19886-19886/myontouch.bwie.com.myontouch I/我是onTouch: onTouch
Android View的onTouchEvent和OnTouch区别的更多相关文章
- Android进阶笔记19:onInterceptTouchEvent、onTouchEvent与onTouch
1.onTouch方法:onTouch方法是View的 OnTouchListener借口中定义的方法,处理View及其子类被touch是的事件处理.当一个View绑定了OnTouchLister后, ...
- Android进阶笔记16:onInterceptTouchEvent、onTouchEvent与onTouch
1. onTouch方法:onTouch方法是View的 OnTouchListener借口中定义的方法,处理View及其子类被touch是的事件处理.当一个View绑定了OnTouchLister后 ...
- android: View, SurfaceView, GLSurfaceView, TextureView 区别与联系
区别与联系 View: 显示视图,内置画布,提供了图形绘制函数.触屏事件.按键事件函数等,必须在UI主线程内更新画面,速度较慢: SurfaceView: 基于view视图进行拓展的视图类,更适合2D ...
- Android View的事件分发
如果接触android开发时间足够长的话,或多或少都会遇到各种各样事件冲突的问题,要想解决这类问题,对深入理解事件分发机制是很有必要的,接下来几天都会尽自己所能尽可能将这方面讲清楚. View的事件 ...
- Android View的滑动
Android View的滑动 文章目录 Android View的滑动 一.实现移动 1.1 layout() 1.2 设置位置偏移量 1.3 改变布局参数 1.4 动画 1.5 ScrollTo以 ...
- 浅谈Android View事件分发机制
引言 前面的文章介绍了View的基础知识和View的滑动,今天我们来介绍View的另一个核心知识,View的事件分发机制. 点击事件的传递规则 所谓的点击事件的分发机制,其实就是对MotionEven ...
- Android view的一些认识
转载:9102年末,我对Android view的13条认识: (顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)https://github.com/xiangjiana/Andro ...
- Android View 事件分发机制 源码解析 (上)
一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...
- Android View中的控件和监听方法...
PS:居然三天没写博客了...今天补上...东西虽多,但是都是一些基础...代码多了一些,有人可能会这样问,粘这么多代码有毛用..其实对于一个Android的初学者来说,一个完整的代码是最容易帮助理解 ...
随机推荐
- SQL Server 2012日志文件误删除数据库质疑后的相关恢复
alter database testdb set emergencyalter database testdb set single_userdbcc checkdb('testdb',REPAIR ...
- Linux进阶文件系统管理之RAID
RAID 1.引言 RAID全称Redundant Arrays of Inexpensive Disks / Redundant Arrays of Independent Disks,即独立冗余磁 ...
- Cacti修改采集精度为1分钟
前言: 基础知识:建议先了解一下 rrdtool 及 rrd 数据库的工作原理,参考阅读<rrdtool学习笔记> cacti主要使用了rrdtool这个工具来绘图,所以看上去比zabbi ...
- SpringBoot和数据库连接
就像单机Java应用程序一样,和数据库连接需要DataSource,然后生成到数据库的Connection再进行数据库操作 SpringBoot和原生的JDBC 先看SpringBoot项目源码 从上 ...
- 改变BootStrap主题颜色
摘自:http://www.asp.net/visual-studio/overview/2013/creating-web-projects-in-visual-studio#bootstrap Y ...
- C语言Notebook
int *pointer=NULL /*指针变量一定要赋初值*/pritnf("Pointer' address is:%p",&pointer); /*打印指针变 ...
- VUE 入门基础(1)
一,安装 Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能模拟的 ECMAScript 5 特性. Vue.js 支持所有兼容 ECMAScript 5 的浏览器. ...
- KBMMW 4.93.10 发布
例行更新,主要是bugfix. 4.93.10 June 4 2016 Important notes (changes that may break existing code) ========= ...
- C#开发微信公众平台(附Demo)
服务号和订阅号 服务号是公司申请的微信公共账号,订阅号是个人申请的,我个人也申请了一个,不过没怎么用. 服务号 1个月(30天)内仅可以发送1条群发消息. 发给订阅用户(粉丝)的消息,会显示在对方的聊 ...
- Kafka深入理解-3:Kafka如何删除数据(日志)文件
Kafka作为消息中间件,数据需要按照一定的规则删除,否则数据量太大会把集群存储空间占满. 参考:apache Kafka是如何实现删除数据文件(日志)的 Kafka删除数据有两种方式 按照时间,超过 ...