前面我们讲了,android中事件分发机制中的一种情况,就是这几个控件之间是一层一层包含关系。下面我们就来探讨一下如果这些控件之间是并列关系,事件是如何分发的呢?
还是之前的例子。只是这些呢,绿色的LinearLayout控件和灰色View的控件,他俩是并列的关系,就是都是红色的FrameLayout的子控件。而不是灰色的控件是绿色控件的子控件。
MainActivity中的源码是:
[AppleScript] 纯文本查看 复制代码 package com.itheima.touchdemo;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = init_view();
setContentView(view);
}
private View init_view() {
MyFrameLayout myFrameLayout = new MyFrameLayout(this);
myFrameLayout.setBackgroundColor(Color.RED);
MyLinearLayout myLinearLayout = new MyLinearLayout(this);
myLinearLayout.setBackgroundColor(Color.GREEN);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(200, 200);
params.gravity = Gravity.CENTER;
myFrameLayout.addView(myLinearLayout, params);
MyView myView = new MyView(this);
myView.setBackgroundColor(Color.GRAY);
FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(100,
100);
params2.gravity = Gravity.CENTER;
myFrameLayout.addView(myView, params2);
return myFrameLayout;
}
}
我们这时候在灰色区域按下,事件分发的流程是:
[AppleScript] 纯文本查看 复制代码 05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: FrameLayout---->dispatchTouchEvent---start
05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: FrameLayout---->onInterceptTouchEvent---start
05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: FrameLayout---->onInterceptTouchEvent---end---false
05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: View---->dispatchTouchEvent---start
05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: View---->onTouchEvent---start
05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: View---->onTouchEvent---end---false
05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: View---->dispatchTouchEvent---end--->false
05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: LinearLayout---->dispatchTouchEvent---start
05-29 07:00:21.859 2367-2367/com.itheima.touchdemo I/System.out: LinearLayout---->onInterceptTouchEvent---start
05-29 07:00:21.860 2367-2367/com.itheima.touchdemo I/System.out: LinearLayout---->onInterceptTouchEvent---end---false
05-29 07:00:21.860 2367-2367/com.itheima.touchdemo I/System.out: LinearLayout---->onTouchEvent---start
05-29 07:00:21.860 2367-2367/com.itheima.touchdemo I/System.out: LinearLayout---->onTouchEvent---end---false
05-29 07:00:21.860 2367-2367/com.itheima.touchdemo I/System.out: LinearLayout---->dispatchTouchEvent---end--->false
05-29 07:00:21.860 2367-2367/com.itheima.touchdemo I/System.out: FrameLayout---->onTouchEvent---start
05-29 07:00:21.860 2367-2367/com.itheima.touchdemo I/System.out: FrameLayout---->onTouchEvent---end---true
05-29 07:00:21.860 2367-2367/com.itheima.touchdemo I/System.out: FrameLayout---->dispatchTouchEvent---end--->true
如果是绿色的控件嵌套灰色控件的话,事件分发的流程是:
[AppleScript] 纯文本查看 复制代码 05-29 07:02:13.393 3154-3154/com.itheima.touchdemo I/System.out: FrameLayout---->dispatchTouchEvent---start
05-29 07:02:13.393 3154-3154/com.itheima.touchdemo I/System.out: FrameLayout---->onInterceptTouchEvent---start
05-29 07:02:13.393 3154-3154/com.itheima.touchdemo I/System.out: FrameLayout---->onInterceptTouchEvent---end---false
05-29 07:02:13.393 3154-3154/com.itheima.touchdemo I/System.out: LinearLayout---->dispatchTouchEvent---start
05-29 07:02:13.394 3154-3154/com.itheima.touchdemo I/System.out: LinearLayout---->onInterceptTouchEvent---start
05-29 07:02:13.394 3154-3154/com.itheima.touchdemo I/System.out: LinearLayout---->onInterceptTouchEvent---end---false
05-29 07:02:13.394 3154-3154/com.itheima.touchdemo I/System.out: View---->dispatchTouchEvent---start
05-29 07:02:13.394 3154-3154/com.itheima.touchdemo I/System.out: View---->onTouchEvent---start
05-29 07:02:13.394 3154-3154/com.itheima.touchdemo I/System.out: View---->onTouchEvent---end---false
05-29 07:02:13.394 3154-3154/com.itheima.touchdemo I/System.out: View---->dispatchTouchEvent---end--->false
05-29 07:02:13.394 3154-3154/com.itheima.touchdemo I/System.out: LinearLayout---->onTouchEvent---start
05-29 07:02:13.395 3154-3154/com.itheima.touchdemo I/System.out: LinearLayout---->onTouchEvent---end---false
05-29 07:02:13.395 3154-3154/com.itheima.touchdemo I/System.out: LinearLayout---->dispatchTouchEvent---end--->false
05-29 07:02:13.395 3154-3154/com.itheima.touchdemo I/System.out: FrameLayout---->onTouchEvent---start
05-29 07:02:13.395 3154-3154/com.itheima.touchdemo I/System.out: FrameLayout---->onTouchEvent---end---true
05-29 07:02:13.395 3154-3154/com.itheima.touchdemo I/System.out: FrameLayout---->dispatchTouchEvent---end--->true
发现区别了吧,如果是父控件子控件的嵌套关系,分发的时候是从上到下,处理的时候是从下到上这样一个循环的过程。而如果绿色的LinearLayout和灰色的View之间是并列的关系呢?他们两个的事件传递过程是,先把事件分发给灰色的View,然后在分发给绿色的LinearLayout。
所以总结一句话:
如果嵌套关系,事件是从父控件到子控件的顺序来进行分发。
如果是并列关系,事件是先分发到顶层的控件,再分发到底层的控件。
|