Android 事件分发机制
2013-06-27 16:24
435 查看
Android的触摸事件分发是从最上层的Activity开始的,然后dispatch到子View,当分发到触发事件的View时,再逐层往回调用onTouchEvent函数,下面是实例代码。(有空还要更彻底的研究下源码)
public class DispatchActivity extends Activity {
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
View disView = new
DispatchView(this);
LayoutParams lp = new
LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
setContentView(disView,
lp);
}
@Override
public
boolean onTouchEvent(MotionEvent event) {
if (event.getAction() ==
MotionEvent.ACTION_DOWN) {
Log.i("()()", "Parent onTouchEvent
Down!!!!!!!!!!!!!!!!");
}
return
super.onTouchEvent(event);
}
@Override
public
boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() ==
MotionEvent.ACTION_DOWN) {
Log.i("()()", "Parent dispatchTouchEvent
Down????????????????");
}
return
super.dispatchTouchEvent(ev);
}
public
class DispatchView extends View {
private Paint paint = new
Paint();
public DispatchView(Context
context) {
super(context);
paint.setColor(Color.RED);
}
@Override
public boolean
dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
Log.i("()()", "Child dispatchTouchEvent
Down#############");
paint.setColor(Color.BLUE);
invalidate();
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean
onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
Log.i("()()", "Child onTouchEvent
Down*****************");
paint.setColor(Color.GREEN);
invalidate();
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas
canvas) {
canvas.drawRect(30, 30, 300, 300, paint);
super.onDraw(canvas);
}
}
}
实例效果如下:
当点击红色的View时,log如下:
如果Child View设置了OnClickListener,那么和在Child
View的onTouchEvent函数中返回True是一个效果,也就是此事件不再向上传播。
public class DispatchActivity extends Activity {
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
View disView = new
DispatchView(this);
LayoutParams lp = new
LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
setContentView(disView,
lp);
}
@Override
public
boolean onTouchEvent(MotionEvent event) {
if (event.getAction() ==
MotionEvent.ACTION_DOWN) {
Log.i("()()", "Parent onTouchEvent
Down!!!!!!!!!!!!!!!!");
}
return
super.onTouchEvent(event);
}
@Override
public
boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() ==
MotionEvent.ACTION_DOWN) {
Log.i("()()", "Parent dispatchTouchEvent
Down????????????????");
}
return
super.dispatchTouchEvent(ev);
}
public
class DispatchView extends View {
private Paint paint = new
Paint();
public DispatchView(Context
context) {
super(context);
paint.setColor(Color.RED);
}
@Override
public boolean
dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
Log.i("()()", "Child dispatchTouchEvent
Down#############");
paint.setColor(Color.BLUE);
invalidate();
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean
onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
Log.i("()()", "Child onTouchEvent
Down*****************");
paint.setColor(Color.GREEN);
invalidate();
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas
canvas) {
canvas.drawRect(30, 30, 300, 300, paint);
super.onDraw(canvas);
}
}
}
实例效果如下:
当点击红色的View时,log如下:
如果Child View设置了OnClickListener,那么和在Child
View的onTouchEvent函数中返回True是一个效果,也就是此事件不再向上传播。
相关文章推荐
- Android TV gridview 的按键事件响应巧变 && 事件分发机制
- Android中view的onTouch&onClick事件分发机制详解
- Android事件分发机制------------>验证+理解
- Android View 事件分发机制 && Android ViewGroup 事件分发机制 源码解析 --总结
- Android 编程下 Touch 事件的分发和消费机制
- Android中View的事件分发机制
- 【Android - 进阶】之事件分发机制
- <Android 基础(四十四)> View事件分发机制
- 【Android】View的事件分发机制123
- android 事件分发机制完全解析 从源码开始(下)
- Android Handler消息机制
- android-----事件分发机制测试系列(五)
- Android Deeper(00) - Touch事件分发响应机制
- android 事件分发机制
- android触摸事件的分发机制、冒泡机制、消费机制
- Android View框架总结(七)View事件分发机制
- Android 事件分发机制完全解析(续)
- Android事件分发机制
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android 编程下 Touch 事件的分发和消费机制