衣柜最为简 | 胶囊衣橱—不止省事还有快乐

嘿是胶囊衣橱

卿是不是认为胶囊衣橱就是恃衣服的数目少,衣橱像胶囊同样精致却可以把富有衣服都加大进去?

不是的。

胶囊衣橱-Capsule
Wardrobe,指的是均等种植增加配术,上装和下装规格化统一化,可以无限制搭配,以比少多少的衣实现强组成,像胶囊同样上下全面兼容。

20世纪80年代中期,美国品牌DKNY创始人Donna
Karan提出“简洁7起”的意:一宗紧身衣、一漫长裙子、一项女装衬衫、一件外套、一件夹克、一条裤子和同起后礼服。在它们底影响下,“胶囊衣橱”这个概念在西方流行起来。

为此胶囊衣橱的要是:搭配。
比如,用12桩单品搭配起15法服装,用15件单品搭配起30套服装。

这么,上面我排下的老三只“榜样”人物其实所用的且不是胶囊衣橱。那种让“制服”衣橱。

博主Caroline(个人博客Unfancy)所成立之,才是真的胶囊衣橱。

37桩单品,满足一季的过正搭配。

艺术 1

她当博客中写道:“对于自的话,胶囊衣橱代表正好费还多之工夫及生命力在更有意义更着重之政工上。”

那,你想不思量也起一个祥和之胶囊衣橱呢?

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()处理。

上文说了如此多还是休敷具体,先用流程图大体说明一个以上三独方法的干,及调用流程,下文还见面结合实际示例详细说明当事变分发传递着各个艺术的调用规则。

三者关系约如下图:

艺术 2

Matilda
Kahl是某家创意公司的艺术总监,某天因为上班花尽多时间挑衣服,在同不行特别要紧的集会及深了。于是它做出了一个危言耸听之操纵:每天还通过同的衣着去上班!于是它请了15起白衬衫,6长达地下裤子,一圆满五个工作日,天天这样,一穿三年。

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()。

连着下去通过具体示例来查阅事件传递的流水线:

什么样立胶囊衣橱

发生少种植正常做法。

  • 同一种植是先行承认穿衣风格、穿正场景、配色、需改善点,然后去重复单品,建立民用穿衣调色板,确定最容易单品,确定经典组合。

  • 其余一样栽是把有单品拿出来审视,根据场合比例来抉择最常用单品,再冲风格以及颜料来选出搭配单品,放弃没选中的,再把选中的单品搭配好照存档。

立即点儿种植做法我开起来还是有难度之。
首先种我会以率先步就是开不下,因为大时候还非理解穿穿风格、配色板之类的。
次栽,在胶囊衣橱之前我参考《怦然心动的盘整魔法》做了几涂鸦整理,留下的行头数量多超胶囊衣橱标准。我的不合理审视带来的是挑困难症。

最终,我下的凡自创的同等模仿流程。

重要提示:新手请只有考虑当季一经穿越的单品,不要同开始便考虑同年的计量。当季!当季!当季!
今昔是冬就止考虑冷冷的是上的单品和搭配吧。

示例五、给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()方法。

乔布斯:经典的地下衫+牛仔裤

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,这吗是一个完全的波序列)

1. 以出几乎布置A4纸,凭记忆写下几独品类的无比轻、最经常通过单品。

本人当时凡是夏,列了小褂儿、下装、裙子、外套、鞋子、配饰6单类别。

  • 大品类下面细分三排,右边留空。
    如:H短裙 | 画个简图 | H型,有光线,前种后黑色,小立领

  • 起定义使用场所,我不过来2只:工作A、休闲B。换个颜色笔在各起单品后面标记适用场合。

  • 右边边的留空是统计用之。
    统计颜色(例如:卡其、白色)、还缺乏什么单品(例如:缺锁骨链),哪种单品不再买(例如:不再进黑色鞋子)

  • 色旁边统计数据
    限统计数据边审视这档子单品是否真诚很喜欢,不喜就划掉。最后一共满单品。我马上于追加增减减后,统计出来23宗。

为什么这么做?

  • 汝会记得起来的单品,往往就是是你无比容易之、常穿底,潜意识不见面骗而。

  • 您晤面当是极其爱的,肯定是公可知hold得下马的铺垫,可能得了别人的讴歌,可能带来被过您自信。

  • 因二八规律,20%之单品可以覆盖而80%底采用场所,这同步,可以列出那20%,作为你的胶囊衣橱的主力。

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

创办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方法中。

艺术 3

示例三、在示例二的基本功及叫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方法来判定了。

提升而的胶囊衣橱

事件分发机制是Android中那个关键之一个知识点,同时为是困难,相信到目前为止很多Android开发者对事件分发机制并没一个老大系统的认识,当然为包括博主个人在内。可能于平时底出工作着我们并没察觉及事件分发机制由及之来意,其实它是时刻在的只是我们不明白而已,就比如有的滑动冲突、点击事件里的撞等等大多是坐事件分发处理不当导致的。想起了博主大学时做过一个微项目,里面就是出现了滑动冲突之问题,虽然最终在网上一步步看正在他人的课也糊里糊涂的缓解了,但总不知其所以然,那么今天便受咱共同来深切之探赜索隐一下事变分发机制吧。

  1. 节省时间。“女人之衣橱总是缺一桩装”可以好好地解释为什么自己每天朝会以衣柜前徘徊半天还确定无了过什么衣服外出。每次换季都感觉到上同年是裸奔过来的。

  2. 瞧钱。极简一开始之动力就是是为省钱,其后有的义还是当践行之后才意识的。

  3. 免除不掌握搭配之疼痛。我自小就是不是单爱美之丁,对穿正搭配是零智商,连亲妈和亲妹都吐槽过自家多不行。若单品少了,搭配出错的频率也就小了。

小结

以更好之敞亮,可以管事件流看成是平拔人,把ACTION_DOWN类型看做探路人,探路人按规定的线先活动相同全副,直到走至View的onTouchEvent这里,如果onTouchEvent返回true,可了解成是路通,后续部队可以过来。如果回去false,可以清楚成这路不通,然后探路人再届Layout(ViewGroup)的onTouchEvent中问路连接不联网,如果连之言语后续部队就不用再失去View那里了,直接到ViewGroup这来就是得了。而要ViewGroup这里路也打断,那么探路人就不得不去Activity的onTouchEvent那里了,后续部队也一直去Activity的onTouchEvent这里虽好了。


说到底想说之是,本系列文章吧博主对Android知识展开重新梳理,查缺补漏之攻过程,一方面是指向好忘记的事物加以复习重新掌握,另一方面相信于重新学习的过程遭到必然会发生光辉的新取得,如果你也发出同自家平的想法,不妨关注自己联合学,互相探讨,共同进步!

参考文献:

  • 《Android开发方式探索》

但,这种穿着虽然那个有风格(其他人不容易学),但那个无趣啊!
怎样才能保留他们的有的做法——衣服量少,但同时未必沦落无趣的程度呢?
念念不遗忘,必起回音,“胶囊衣橱”入了我之家常。

示例四、如果当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

艺术 4

嗬是事件分发机制?

说了半天的风波分发机制那究竟是独吗东西吧?我们绝不把它想象的那大深莫测,不要在思想上受好只要上阻碍,其实非常容易了解,博主的知是:简单的话,事件分发机制就是Android系统针对事件传递过程规定之一模一样种事件传递规则,事件还见面按这个规则进行分发传递。

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

  • 为明白分析目标:MotionEvent。
  • 打听三只方式:dispatchTouchEvent(MotionEvent
    event)、onInterceptTouchEvent(Motion
    event)、onTouchEvent(MotionEvent event)。
  • MotionEvent事件之传递过程
  • 小结

艺术 5

示例二、在示例一的底蕴及,让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处理。

点滴步打造初级胶囊衣橱

除它,还有谁的工作服这么简单?

3、工具使用——今日装App

今装App是自身所运用的不过简便易行的一个衣橱管理软件,没有社交功能,没有消息推送。该有的法力刚刚好,界面简单,一目了然,深得我心。

艺术 6

怎么用?

  1. 盘点——把基础胶囊衣橱里的具备单品收录进App中。一次性收录工作量比充分之说话,可以每天用当天底铺垫单品,少量多次。

  2. 记录——每天用这些单品进行铺垫,记录并拍摄及传App。如果无记录,后面的迭代创新都是捕风捉影。有了记录之真相,我们才能够当此基础及做文章。

  3. 复盘——每隔一段时间翻看记录(例如每个星期),审视哪些穿搭是恰当的,哪些是亮眼的,哪些是不好的得被裁的。在选配下面一一记录下来。

自身前面拍的觊觎太暗了,就不加大上来了,这个软件不死,下充斥来试试看吧,你见面出惊喜的。

4、学习搭配

面都说了,胶囊衣橱的要紧是选配,那么,要提升初级胶囊衣橱的调头,搭配要得要学的。

衣服衬托是平等门户学问,关于这宗学问的书、公众号文章大都如果牛毛。我弗专业人士就非妄言了。我就写自己实际应用的文化,够用就好。如果你们无是追每日更新、时尚潮流,那我之分享当针对你们有价。

务必控制的知框架是:颜色搭配、穿衣作风。

  • 颜色搭配——从初级胶囊衣橱中,我们应有能够发现自己的水彩偏好了。理论知识上要续的凡私房的时尚调色板,包括三单内容:

3-4独至关重要色彩(出现频率最高、最能表示个人风格的情调)

2独中性色彩 (黑白灰,和外颜色都得以搭配)

2-5独流行色彩(黑白灰以外的水彩、出现频率没有那么强,但是自及强调、多元化、画龙点睛之企图)。

艺术 7

http://mp.weixin.qq.com/s/-JT0pkIeu6aG5zSnKLmKyA

关于调色板的复多参考可以扣押这篇稿子《超简单但好发因此!怎样创造而的私房时尚调色板?(纯干货+多图讲解)》。
自我还足以享用24色板及双色搭配的学问,有需要的话留言告知我吧。

  • 穿风格——这个最标准了,推荐大家一直看即首文章《如何掌握自己之衣风格?》,专业的从事交给专业的人头来做,我的穿衣作风是找专业人士进行相同针对同叩问确定下的。

自己个人的敞亮,风格与两独面有关:精神层面——是凭个人的智识和审美来搭构一个框架和骨干,技术层面——各种细节。

审美是一个不合情理的网,穿搭可以分类到“艺术”领域了。我会见失掉上就片学问,是因自小没被过熏陶,长大了吧非热爱让扣潮流杂志,对这些东西“没有发”。还吓,知识可以弥补一些。

发生日,还好交Pinterest上大多看看街拍,熏陶一下,找找感觉。

扎克伯格:牛仔裤和浅灰色T恤(其实他过西装蛮好看的)

望此,我吃惊了!创意公司吧,艺术总监耶,这也尽无了咔嚓……
原来,人家假期的时并无穿这等同身,这只是是它们底工作服。

5、根据3之笔录与4之上学,做“搭配”表格。

制造一个民用的掩映模板,比如赫本的高领黑毛衣和芭蕾平底鞋,简铂金的白衬衫和牛仔阔腿裤。

以下是自己之“搭配”表格:

艺术 8

它们的打算是:量身定做的搭配模板,省事、省时、省钱的家伙。

自打表里能够看得出来我之风骨也?我是少年型的。
可知顾我扬长避短的地方吧?
看得出来我之购物重点及雷区吗?

“搭配”表格的定义并无是我的原创,我借鉴了马上篇稿子《简衣橱||规划好之搭配“制服”》,并运用了它们底法子。

“搭配”表格是本人当下探索胶囊衣橱的争鸣终点了。

连片下要召开的,就是不停践行,完善“搭配”表格。

购物冲动来时,打开你的今日装App,打开你的“搭配”表格,确定是要是替换或新增,还是小在灵感里。


总结:
简单步法打造初级胶囊衣橱,一上不怕足以做到。
接下来经践行和上迭代、升级而的胶囊衣橱,最终赢得你的直属搭配表格。
重复漂亮?更起格调?持续学习及践行吧,这部分故事,要你们来分享了。

我之极简理念:非在于物质的有些,而是不妄方寸。要任由必要,勿增实体。

受衣橱里装满我们的愉悦,每一样件单品都带为咱满足,而休纠结。这是胶囊衣橱给到自我额外的收获,愿君也同等有着。

2、清空衣柜,把1遭受陈列的单品挂起来或整叠好。

而可设定一个基础艺术值,例如33或者37码单品(33来源于33project,37来源于Caroline)。

  • 比方1挨的单品足够,那么余下的单品就可以直接收起来了。

  • 设1遇之单品未够,那么尽管当多余的单品中,用最挑剔的眼光,像于商场里打相同,挑来那么几宗您还愿意再消费一样不好钱购置下来的单品。

另外的单品,收拢到一个不便于用到之地方,或者直接清理掉。

2步后,你有了一个初级胶囊衣橱。

缘何而穿得这样简单也?大佬们的琢磨我不亮,也未错过蒙,但本身充分喜爱是idea,它可以满足自家三独要求:

发表评论

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

网站地图xml地图