博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android事件分发机制初探
阅读量:6824 次
发布时间:2019-06-26

本文共 2447 字,大约阅读时间需要 8 分钟。

Android的触摸事件分发是从最上层的Activity开始的,然后dispatch到子View,当分发到触发事件的View时,再逐层往回调用onTouchEvent函数,下面是实例代码。(有空还要更彻底的研究下源码)

1 public class DispatchActivity extends Activity { 2  3     @Override 4     protected void onCreate(Bundle savedInstanceState) { 5         super.onCreate(savedInstanceState); 6  7         View disView = new DispatchView(this); 8         LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, 9                 LayoutParams.FILL_PARENT);10         setContentView(disView, lp);11     }12 13     @Override14     public boolean onTouchEvent(MotionEvent event) {15         if (event.getAction() == MotionEvent.ACTION_DOWN) {16             Log.i("()()", "Parent onTouchEvent Down!!!!!!!!!!!!!!!!");17         }18         return super.onTouchEvent(event);19     }20 21     @Override22     public boolean dispatchTouchEvent(MotionEvent ev) {23         if (ev.getAction() == MotionEvent.ACTION_DOWN) {24             Log.i("()()", "Parent dispatchTouchEvent Down????????????????");25         }26         return super.dispatchTouchEvent(ev);27     }28 29     public class DispatchView extends View {30         31         private Paint paint = new Paint();32 33         public DispatchView(Context context) {34             super(context);35             paint.setColor(Color.RED);36         }37 38         @Override39         public boolean dispatchTouchEvent(MotionEvent event) {40             if (event.getAction() == MotionEvent.ACTION_DOWN) {41                 Log.i("()()", "Child dispatchTouchEvent Down#############");42                 paint.setColor(Color.BLUE);43                 invalidate();44             }45             return super.dispatchTouchEvent(event);46         }47 48         @Override49         public boolean onTouchEvent(MotionEvent event) {50             if (event.getAction() == MotionEvent.ACTION_DOWN) {51                 Log.i("()()", "Child onTouchEvent Down*****************");52                 paint.setColor(Color.GREEN);53                 invalidate();54             }55             return super.onTouchEvent(event);56         }57 58         @Override59         protected void onDraw(Canvas canvas) {60             canvas.drawRect(30, 30, 300, 300, paint);61             super.onDraw(canvas);62         }63 64     }65 66 }

 

实例效果如下:

 

当点击红色的View时,log如下:

 

如果Child View设置了OnClickListener,那么和在Child View的onTouchEvent函数中返回True是一个效果,也就是此事件不再向上传播。

 

 

转载于:https://www.cnblogs.com/coding-way/archive/2012/07/04/2575769.html

你可能感兴趣的文章
算法训练 关联矩阵
查看>>
Git-随笔
查看>>
CSS系列:在HTML中引入CSS的方法
查看>>
GridView编辑删除操作
查看>>
【转】为什么我们喜欢把火撒在亲人身上
查看>>
Android多媒体系列2:利用MediaRecorder实现录音
查看>>
【转载】兼容php5,php7的cURL文件上传示例
查看>>
POJ2239 Selecting Courses【二部图最大匹配】
查看>>
Mac上远程桌面连接Windows Server 2012 R2
查看>>
shopkeep/spark Dockerfile示例
查看>>
MyEclipse jQuery智能 提示
查看>>
【CodeForces 602C】H - Approximating a Constant Range(dijk)
查看>>
Eclipse的设置小细节提高开发效率
查看>>
编程学悲伤
查看>>
机器人api(图灵机器人)
查看>>
windows环境phpstorm调试环境搭建
查看>>
Maven 集成Tomcat7插件
查看>>
VS2013快捷键
查看>>
Workerman
查看>>
Jasper(物联网网络支撑平台公司)的技术为什么这么牛逼?
查看>>