关于android 的事件分发机制
来源:互联网 发布:新浪微博数据2017 编辑:程序博客网 时间:2024/05/21 17:36
android 关于事件分发的三个方法:
dispatchTouchEvent代表事件分发,返回值为true或false都表示不分发,返回super.dispatchTouchEvent表示将事件分发下去
onInterceptTouchEven代表事件拦截(ViewGroup特有的事件),返回值为true表示拦截事件,交给ViewGroup的OnTouchEvent处理,返回值为false表示交给子view的dispatchTouchEvent进行事件分发
onTouchEvent代表事件消费,返回值为true表示消费,返回值为false表示不消费,该事件将交给父控件的onTouchEvent进行处理
首先在dispatchTouchEvent中最先执行的就是onTouch方法,而onClick的调用是在onTouchEvent(event)方法中,因此onTouch肯定是要优先于onClick执行的。
而如果在onTouch方法里返回了true,就会让dispatchTouchEvent方法直接返回true,不会再继续往下执行。
下附代码说明,有兴趣的可以直接跑一下验证
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout ll = (LinearLayout) findViewById(R.id.ll); Button btn = (Button) findViewById(R.id.btn); ll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "LinearLayout: "); } }); ll.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return false; } }); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "Button: "); } }); btn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return false; } }); }}
@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) { Log.e(TAG, "MyLayout onInterceptTouchEvent default return " + super.onInterceptTouchEvent(ev)); return super.onInterceptTouchEvent(ev);}改成
@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) { Log.e(TAG, "MyLayout onInterceptTouchEvent default return " + super.onInterceptTouchEvent(ev)); return true;}然后添加一句代码
btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "Button: "); btn.setText( "Button: "); }});
运行之后,btn不会触发点击事件,因为事件被MyLayout拦截了,转而触发MyLayout的点击事件,如果这个时候设置onTouch事件返回true,那么连MyLayout的点击事件也不会触发,因为OnTouchEvent没有接受到事件,在OnTouchEvent内部被调用的OnClick事件自然也不会触发
最后再补充一句,ViewGroup和View都有dispatchTouchEvent方法,如果在ViewGroup里面dispatchTouchEvent的返回值为true,那么事件就不会分发下去,在我这个例子里面就是没有触发btn的点击事件
- 关于Android事件分发机制的理解
- 关于Android 事件分发机制的学习
- 关于android 的事件分发机制
- 关于Android的事件分发机制
- 关于android事件分发机制
- 关于android事件分发机制
- Android的事件分发机制
- Android事件的分发机制
- Android的事件分发机制
- Android 的事件分发机制
- android 事件的分发机制
- Android 的事件分发机制
- Android事件的分发机制
- Android的事件分发机制
- android事件的分发机制
- Android的事件分发机制
- android的事件分发机制
- Android的事件分发机制
- MY_Swift_数组安全索引与数组切片
- Kryo序列化与反序列化列子
- CentOS7,MySQL主从配置和读写分离(MySQL主从、MySQL读写分离、MySQL分布式、数据库读写分离、主从配置)
- phoenix-hbase 服务频繁挂掉问题排查
- C语言模拟实现C++的继承与多态
- 关于android 的事件分发机制
- 数组的交集、并集……
- SQL CONSTRAINT
- let和const命令学习总结
- Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法
- 实现安卓程序退出后重进自己程序的一个小功能(android,unity)
- 详解location.href几种用法的区别
- jQuery插件封装
- mint-ui —— search的使用