- 首先需要我们知道android的控件架构:
每一个activity都包含一个window对象,也就是phonewindow,phonewinodw把DecorView当做根视图,也就是顶层视图,所有view的监听事件,都通过WindowMannagerServer来进行接收的,并且通过activity对象来回调响应的onClickListener。那个title也就是平时的actionbar,ContentView就是我们天天都要接触的部分了。这也就解释了为什么要在setContentView前设置requestWindowFeature(Window.FEATURE_requestWindowFeature())在调用setContent方法前调用。
- view的测量
测量都是在onMeasure()方法中进行,需要用到MeasureSpec类,通过这个类我们可以拿到具体的测量模式和测量到的测量值。其中MeasureSpec是一个32位的int值,其中高2位位测量的模式,低30位是测量的大小。
测量模式
- EXACTLY
精确模式,就是当我们制定控件的layout_width和layout_height属性为具体值时,android:layout_width=”200dp”, 同时也要注意了,如果是android:layout_width=“match_parent”时也是使用的该模式 - AT_MOST
这个可能就是用的最多的。最大值测量模式,在viewgroup的时候可能用的都是这个吧。当控件的layout_width和layout——height属性指定为wrap_content时,控件大小一般随着控件的子控件或者内容的变化而变化,此时控件的尺寸只要不超过父控件允许 的最大值即可 - UNSPECIFIED
这个其实也不太懂,通常情况下载绘制自定义view时候使用
- EXACTLY
view类默认的onMeasure()使用的方法只支持EXACTIY模式,所以在自定义的时候记得重写onMeasure()方法。不然控件只能响应具体的宽高和match_parent属性,没办法wrap_content。
###演示代码
|
|