Android查缺补漏(View篇)–事件分发机制

情调是我们着眼事物之第
平服知,是最好会感动我们感官的视觉元素。色彩可以刺激我们的联想,刺激我们的心怀。在筹划被,色彩的成立施用一直是个要命重点之课题。相信大部分丁都对准色彩有所了解,在这里被咱做个复盘,一起来回顾下关于色彩的有些常识。

事件分发机制是Android中特别重大的一个知识点,同时也是难题,相信到目前为止很多Android开发者对事件分发机制并无一个非常系统的认,当然为包括博主个人在内。可能于平常之付出工作备受我们并无意识及事件分发机制从至之来意,其实它们是时刻存在的只是我们无理解而已,就像有些滑动冲突、点击事件中的冲突等等大多是因事件分发处理不当导致的。想起了博主大学时开了一个有点类,里面就是应运而生了滑动冲突的题目,虽然最终以网上一步步拘留在别人的科目也糊里糊涂的化解了,但总归不知其所以然,那么今天就给我们一并来深切的追一下风波分发机制吧。

情调常识

什么是事件分发机制?

说了半天的波分发机制那到底是个什么东西呢?我们决不将她想象的那么高深莫测,不要以心理及为协调要上阻碍,其实生易理解,博主的接头是:简单来说,事件分发机制就算是Android系统针对事件传递过程规定的一致种植事件传递规则,事件都见面遵循此规则进行分发传递。

在研讨事件分发机制前,我们先来规定一下剖析的步调,化整为零,各个击破:

  • 下手明白分析目标:MotionEvent。
  • 摸底三只艺术:dispatchTouchEvent(MotionEvent
    event)、onInterceptTouchEvent(Motion
    event)、onTouchEvent(MotionEvent event)。
  • MotionEvent事件的传递过程
  • 小结

色彩是什么

MotionEvent

实际上点击事件之分发过程尽管是对MotionEvent事件的散发过程,当用户点击操作以下后,MotionEvent事件就产生并通过自然的规则传递至指定的View上,这个传递的历程与规则就是是事件分发机制。

假使点击操作触发MotionEvent事件是一个风波流或说是一个波序列,其独立的轩然大波类有如下三栽:

  • MotionEvent.ACTION_DOWN:手指刚点下屏幕时接触此类型。
  • MotionEvent.ACTION_MOVE:手指在屏幕上动时见面频繁沾此类型。
  • MotionEvent.ACTION_UP:手指在屏幕及翘起时接触此类型。

一旦特别注意的凡,通常状态下一个MotionEvent事件序列包含一个 ACTION_DOWN
若干个 ACTION_MOVE 和 ACTION_UP
是一个完整的波序列。(点下这抬起指头时,会只有来 ACTION_DOWN 和
ACTION_UP,这为是一个完的轩然大波序列)

色彩是可见光的打算所招的视觉现象。光是一栽电磁波,不同波长的可见光投射到物体及,一部分深受接到,一部分被反射进入人口眼睛,大脑再将这种刺激反映成色彩信息。所以说,没有就,就从未色彩可言。

dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent

  • boolean dispatchTouchEvent (MotionEvent event):

分发事件,只要事件能传递到眼前View就得会调用此方,其返回回值是一个布尔色表示是否消耗事件。返回true代表吃事件,事件流的继承有还会见就传递过来;返回false代表不吃事件,事件流的接轨有即使不再传递给之。

  • boolean onInterceptTouchEvent (MotionEvent ev):

夫方表示是否拦截MotionEvent事件,只有ViewGroup类型的控件才发之方式。如果这个方法返回true表示拦截事件,事件将传递让当下View的onTouchEvent()方法,而不再为那个属下的View传递。如果这方式返回false表示不阻碍事件,事件将传递给下属View的dispatchTouchEvent()。

  • boolean onTouchEvent (MotionEvent event):

斯办法用来处理MotionEvent,返回值表示是否消耗事件。返回true表示耗事件,那么事件流的接续有还见面传递过来;返回false表示未吃事件,事件将付诸上级View的onTouchEvent()处理,如果上级View的onTouchEvent()仍然返回false,那么事件将重新交付上级的上司处理,以此类推,如果各国View的onTouchEvent()都未吃事件,那么事件结尾用交由Activity的onTouchEvent()处理。

上文说了这么多还是勿足够具体,先用流程图大体说明一个以上三单办法的关联,及调用流程,下文还会做实际示例详细说明当事变分发传递着逐一艺术的调用规则。

三者关系约如下图:

图片 1

情调三因素

MotionEvent事件传递过程

当手指点击屏幕来一个Touch事件后,事件仍Activity->Window->View的各个依次传递。

率先会传送给Activity的dispatchTouchEvent(),在这个办法中会将由Window处理,接着事件会传送给根View,根View接收到事件后虽会以事件分发机制去处理事件。

根View在此虽是一个ViewGroup,它当收受到事件后会调用dispatchTouchEvent(),在是道中会通过onInterceptTouchEvent()方法判断是否拦截事件,如果onInterceptTouchEvent()返回true就表示它若阻止事件,事件将传递让当下ViewGroup的onTouchEvent()。如果onInterceptTouchEvent()放回false就表示她不遮事件,事件将污染于其下属的View,调用下级View的dispatchTouchEvent()。

根View的下面View可能又是一个ViewGroup,如果这样的话其传递流程与根View一样。无论根View的部下View是匪是ViewGroup,如果不挡事件,最终事件会传送及一个纯View的控件上。

当一个View(纯View控件)接收到事件后,也会调用其dispatchTouchEvent(),然后以这个道中会调用当前View的onTouchEvent(),如果onTouchEvent()返回true则代表如果拍卖是事件。如果回到false表示未吃事件,其上级View的onTouchEvent()将给调用,则事件流的接续有不再传递到目前View,在一个事件流中也非见面再度调用当前View的dispatchTouchEvent()。

联网下去通过具体示例来查事件传递的流水线:

色彩的三要素包括色相,明度,饱和度。

示例一,默认情况下的波传递流程

缔造3只类似,一个Activity、一个持续自LinearLayout的View,一个后续自Button的View,并再度写他们之dispatchTouchEvent()、onIntercepteTouchEvent()、onTouchEvent(),三独像样以及布局文件之代码如下:

  • EventDispatchActivity

/**
 * 事件分发机制测试Activity
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchActivity extends AppCompatActivity {

    private final static String TAG = "Activity";//EventDispatchActivity.class.getSimpleName();

    private EventDispatchTestView edtv_test;
    private EventDispatchLinearLayout edll_test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_dispatch);
        edtv_test = ViewUtils.find(this, R.id.edtv_test);
        edll_test = ViewUtils.find(this, R.id.edll_test);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {

        // 被调用时输出log,event.getAction表示事件的类型,0:ACTION_DOWN,1:ACTION_UP,2:ACTION_MOVE。

        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
        return super.onTouchEvent(event);
    }
}
  • EventDispatchLinearLayout

/**
 * 事件分发机制测试 ViewGroup
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchLinearLayout extends LinearLayout {

    private final static String TAG = "——Layout";//EventDispatchLinearLayout.class.getSimpleName();


    public EventDispatchLinearLayout(Context context) {
        super(context);
    }

    public EventDispatchLinearLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        Log.i(TAG, "onInterceptTouchEvent: " + event.getAction() + " | 是否拦截:" + false);
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + false);
        return super.onTouchEvent(event);
    }
}
  • EventDispatchTestView

/**
 * 事件分发机制测试 View
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchTestView extends Button {

    private final static String TAG = "————View";//EventDistpatchTestView.class.getSimpleName();

    public EventDispatchTestView(Context context) {
        super(context);
    }

    public EventDispatchTestView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
        return super.onTouchEvent(event);
    }
}
  • 布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="cn.codingblock.view.event_dispatch.EventDispatchActivity">

    <cn.codingblock.view.event_dispatch.EventDispatchLinearLayout
        android:id="@+id/edll_test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#cccccc">

        <cn.codingblock.view.event_dispatch.EventDispatchTestView
            android:id="@+id/edtv_test"
            android:layout_width="300dp"
            android:layout_height="300dp"
            android:layout_margin="10dp"
            android:background="#000000"/>

    </cn.codingblock.view.event_dispatch.EventDispatchLinearLayout>

</LinearLayout>

运行代码,点击EventDispatchTestView(黑色区域),log输出如下(log中之数字代表事件之品种,0:ACTION_DOWN,1:ACTION_UP,2:ACTION_MOVE):

01-05 16:58:05.574 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:true

01-05 16:58:05.611 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 2 | 是否消耗事件:true

01-05 16:58:05.619 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.619 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.619 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-05 16:58:05.620 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.620 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 1 | 是否消耗事件:true

由log可以望ViewGroup的onInterceptTouchEvent方法默认是无挡事件的,View的onTouchEvent方法默认消耗事件。事件流的ACTION_DOWN类型Motion
Event率先到达View的onTouchEvent方法中,此时onTouchEvent方法返回true,表示若处理事件,所以事件流的延续有还通过log中之流程到达了View的onTouchEvent方法中。

色相作为色彩的要特征,它依靠的是色彩的容颜,是咱们别不同颜色之判断标准。色相由原色、间色和复色构成,且色相是极致加上的。

示例二、在示例一的基本功及,让View的onTouchEvent不吃事件不时之传递流程

联网下去让方的EventDispatchTestView的onTouchEvent返回false:

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + false);
    return false;//super.onTouchEvent(event);
}

测试log如下:

01-05 18:18:52.545 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.545 10771-10771/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:18:52.547 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 0 | 是否消耗事件:true

01-05 18:18:52.629 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 18:18:52.629 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 2 | 是否消耗事件:true

01-05 18:18:52.630 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 18:18:52.630 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 1 | 是否消耗事件:true

当View的onTouchEvent不吃事件频仍,事件会付出ViewGroup的onTouchEvent方法处理,而由log可以见见ViewGroup的onTouchEvent默认为无吃事件,所以事件由提交Activity的onTouchEvent方法处理,最终事件流的接续有不再传递让ViewGroup和View,而是一直传送给Activity的onTouchEvent处理。

明度,即色彩的亮度,明度反映的凡色彩的浓淡变化,一般景象下以颜色中参加白色,明度提高,加入黑色,明度降低。

示例三、在示例二的基本功及让ViewGroup消耗事件

修改EventDispatchLinearLayout的onTouchEvent(),让那个返回true。

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
    return true;//super.onTouchEvent(event);
}

测试log如下:

01-05 18:34:53.409 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.410 21169-21169/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:34:53.410 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:true

01-05 18:34:53.420 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 18:34:53.420 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 18:34:53.420 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 2 | 是否消耗事件:true

01-05 18:34:53.470 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 18:34:53.470 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 18:34:53.470 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 1 | 是否消耗事件:true

是种情况下,事件流的ACTION_DOWN先到达View的onTouchEvent,发现它们不吃事件,继而返回上级的ViewGroup的onTouchEvent中,发现其使耗事件,事件流的存续有即使不在传递给View,也非在调用ViewGroup的onInterceptTouchEvent方法,因为已明白View不处理事件,所以没必要更经onInterceptTouchEvent方法来判断了。

饱和度即纯度,指色彩的花哨程度。纯度越强,色彩越来越强烈,纯度越没有,色彩越来越黯淡。

示例四、如果在ViewGroup的onInterceptTouchEvent中回到了true拦截了风波,整个事件将不再传递让View而是直接到由ViewGroup的onTouchEvent处理。

修改EventDispatchLinearLayout的onInterceptTouchEvent(),让那归来true。

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    Log.i(TAG, "onInterceptTouchEvent: " + event.getAction() + " | 是否拦截:" + true);
    return true;//super.onInterceptTouchEvent(event);
}

测试log如下:

01-05 19:03:21.788 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:true
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:true
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 2 | 是否消耗事件:true
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 1 | 是否消耗事件:true

情调分类

示例五、给View绑定OnTouchListener和OnClickListener监听器。

每当EventDispatchActivity的onCreate()方法中添加如下代码,并将EventDispatchLinearLayout和EventDispatchTestView的每艺术的归值都还原成示例一负之状态。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_event_dispatch);
    edtv_test = ViewUtils.find(this, R.id.edtv_test);
    edll_test = ViewUtils.find(this, R.id.edll_test);

    edtv_test.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
            Log.i("————View", "onTouch: 返回 " + false);
            return false;
        }
    });

    edtv_test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
            Log.i("————View", "onClick: ");
        }
    });
}

测试log如下:

01-06 19:35:07.563 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:true

01-06 19:35:07.573 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.574 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.574 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 2 | 是否消耗事件:true

01-06 19:35:07.673 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 1 | 是否消耗事件:true
01-06 19:35:07.704 6737-6737/cn.codingblock.view I/————View: onClick: 

接下来又端修改代码,让onTouch()方法吃事件,也就是回true,再观log:

edtv_test.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
        Log.i("————View", "onTouch: 返回 " + false);
        return false;
    }
});

log如下:

01-07 11:03:55.411 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

01-07 11:03:55.542 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

01-07 11:03:55.560 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

于log中我们得以看到:

  • 也View绑定的OnTouchListener中的onTouch()方法是优先给View的onTouchEvent()方法执行之。如果当onTouch()消耗了轩然大波(返回true),那么事件将无在传递给onTouchEvent()方法,最终为不见面调用onClick()方法。
  • 啊View绑定的OnClickListener中的onClick()方法优先级最低,是当一切事件流了晚才会被调用,也便是需要通过手指的比如下–抬起是历程才会触发onClick()方法。

1.本色:色彩中莫克再解释的基本色称为原色。通原色能合成出其它色,而其余色不克还原出原色。色光三本色为吉利、绿、蓝,与的对应之就算是咱们经常干的RGB。

小结

以重新好的晓,可以拿事件流看成是如出一辙帮人,把ACTION_DOWN类型看做探路人,探路人按规定之线路先活动相同周,直到走及View的onTouchEvent这里,如果onTouchEvent返回true,可明白成者路通,后续部队可以恢复。如果回到false,可以理解成是路不通,然后探路人再至Layout(ViewGroup)的onTouchEvent中问路通不搭,如果接的语句后续部队虽不要再行失View那里了,直接到ViewGroup这来即好了。而使ViewGroup这里路也不通,那么探路人就不得不去Activity的onTouchEvent那里了,后续部队为一直去Activity的onTouchEvent这里就可了。


最终想说的是,本系列文章也博主对Android知识展开重新梳理,查缺补漏之求学过程,一方面是指向团结忘记的事物加以复习重新掌握,另一方面相信于重新学习的进程遭到一定会来宏伟的初获得,如果你为发跟我平的想法,不妨关注自身一同读书,互相探讨,共同进步!

参考文献:

  • 《Android开发方探索》

2.间色:由少数独原色混合得间色。色光三间为品红、黄、青。颜料三原色指橙、绿、紫。

3.复色:由原色和间色混合,或间色与间色混合而成的色彩。复色中包涵全部三原色,只是三原色的百分比不同。

色彩渊源

中西方艺术的上扬潜是简单栽不同的色彩观,一种植是教的,感性的。一栽是科学的,严谨的。西方艺术由基督教中衍生出来,从神学走向是。背后的知逻辑来
亚里士多德的不易逻辑。而中国知识中的情调相为阴阳五行及儒道玄禅为根基。下面我们连的出口说东西方各自色彩观的形成过程

东方

神州顶今天了还无同仿好正确严密的色彩色彩理论体系,这和华夏绵延了两千基本上年之封建社会有着紧密的干。封建社会一直认可的情调系统是起于阴阳
五行基础之上的五履行色彩学说,分别指赤,黄,青和黑白无色。所谓“东方谓之青,南方谓之光,西方谓之白,北方谓之地下,天谓之微妙,地谓之败”又发出“土黄、金
白、木青、火赤、水墨”一说。在这基础及,封建社会自上而下实行严密的“色彩统治”,自明清开班黄
色开始给得为国专用色彩,且老百姓值得穿布衣,着白
色,粉色等素色服装,高纯度的色彩只在贵族间流行。所以这么看来,现在之炎黄丁如此爱大彩度的情调,如大红,大绿等啊得以解。因为他俩对于情调的求
被克服了太久,一旦这种规则为辟,便会井喷一样的突发出。色彩的烘托讲究完整性,一旦色相环中的局部色彩被取缔,将会摔整体的色彩加配网。所以直
到如今,中国当无色说之上没有获更加的上扬,也尚无变异完全严密的色彩理论体系。我们的邻国日本丛明治维新时期即从头引进色彩学,并且以明治9年那
早的中在小学就是已设置色彩学课程。直到当代,中国正规的色彩机构或要命少,因此当情调及还没有法与发达国家对接。

西方

早在文艺复兴时期,达芬奇就提出:“全部底情调来源于光,没有仅仅,就不曾情调,就什么为看无展现。黄
色是天底下、绿色是次、兰色是老天大气、红色是炸、黑色是黑
暗”。牛顿是上天色彩史上的开山鼻祖,著有《光学》一开,且通过三棱镜原理发现了仅之七色原理。自牛顿开班,西方的色彩科学开始一步步发展下去,直至
100年前美国底情调学上成熟期,开始领军世界,其中最为出名的即使是
先生,今天逐一行当里下的蒙赛尔体系就为外所创造,(如图,蒙赛尔系是故立体型来表示颜色的等同种植方式),至此色彩的三属性(明度、彩度、色相)体系
初步建立。

坐色彩学早已为实现上西方社会每个相关领域,如盖、服装、装饰、广告等。色彩的抉择,不是略的几乎单有水平的人头即便足以操纵的,需要同模拟严谨的对体系。其次,色彩科学为推荐教育体系中,使得整体国民美学素质好升任。这些还是凡我们若往西方先进国家学习的。

色彩的感官性状

情调可以调动我们某种特定的心思,激活我们某种特定的感想。近年来,关于色彩心理学,色彩性格学说啊更为走俏,那么究竟色彩有哪些特点,能给丁带什么影响?这里我们大体整理一下。

情调的冷暖

情调的冷暖是人人以累加时的在被攒之颜料发。且冷暖是单相对概念,因人而异,毕竟每个人的生活环境还不比。通常状态下,红色,橙色,粉色使人头联想到火
焰和阳光等物,让丁发温暖如春。蓝色,紫色使人头联想到蓝天白雪等东西,让丁倍感冷。色彩的酸甜苦辣特性经常于下在日常设计之中。夏季酷暑,电风扇必不可
少,电风扇的颜色大多也白,极少数电风扇是辛亥革命,橙色。虽然吹来之歌谣是一律的,但红色电扇更易于被人口产生热之感觉。同样当室内设计方,冷色的点缀风格使
人深感凉爽。实验表明,暖色与冷色可以假设人头对房的心理温度相差2~3 。

重复多关于设计师的知可以登录厚学网:https://www.houxue.com/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图