A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

前面我们讲了,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。
所以总结一句话:
如果嵌套关系,事件是从父控件到子控件的顺序来进行分发。
如果是并列关系,事件是先分发到顶层的控件,再分发到底层的控件。

1 个回复

正序浏览
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马