重新认识View(三) View事件分发:传递MotionEvent,还是和前端相似的机制,是否消费了事件,主要有是由三个过程完成,分发,拦截,调用。简单的理解为:点击后最先分发给Activity->PhoneWindow->DecorView。 一个事件一般只被一个View拦截并消耗。ViewGroup默认不拦截任何事件,一个View默认会消耗事件并返回true,除非clickable和longClickable同时为fale,View的longClickable默认为false。Button默认clickable为true,TextView默认为false。onClick事件可以说是View最后调用的事件了,发生的前提是view可点击,同时收到了down和up事件。onTouchListener优先于onTouchEvent。setOnClickListener后,会将View的clickable设为true。 DecorView继承了FrameLayout,是当前界面的底层容器,setContentView的View的父容器。值得一提的是MeasureSpec:一个32位int值,高2位代表Mode,低30位代表Size,Mode:UNSPECIFIED(不限制),EXACTLY(精确),AT_MOST(可用大小)。MeasureSpec由LayoutParams和父类一起决定。 View工作流程:measure(测量),layout(布局),draw(绘制)。measure是final类型的,不可重写。有需要只能重写onMeasure()方法。 先写这些,果然View好复杂-_-,平时使用的那些只是冰山一角。