1. onMeasure
a. 属于View的方法,用来测量自己和内容的来确定宽度和高度
b. view的measure方法体中会调用onMeasure
2. onLayout
a. 属于ViewGroup的方法,用来为当前ViewGroup的子元素的位置和大小
b. View的layout方法体中会调用onLayout
3.onMeasure和onLayout
onMeasure在onLayout之前调用
4. 设置background后,会重新调用onMeasure和onLayout
我们知道View在屏幕上显示出来要先经过measure和layout. 在调用onMeasure(int widthSpec, int heightSpec)方法时,要涉及到MeasureSpec的使用,MeasureSpec有3种模式分别是UNSPECIFIED, EXACTLY和AT_MOST, 那么这些模式和我们平时设置的layout参数fill_parent, wrap_content有什么关系呢。经过代码测试就知道,当我们设置width或height为fill_parent时,容器在布局时调用子view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。而当设置为wrap_content时,容器传进去的是AT_MOST, 表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。当子view的大小设置为精确值时,容器传入的是EXACTLY, 而MeasureSpec的UNSPECIFIED模式目前还没有发现在什么情况下使用。
整个layout过程比较容易理解,一般情况下layout过程会参考measure过程中计算得到的mMeasuredWidth和mMeasuredHeight来安排子视图在父视图中显示的位置,但这不是必须的,measure过程得到的结果可能完全没有实际用处,特别是对于一些自定义的ViewGroup,其子视图的个数、位置和大小都是固定的,这时候我们可以忽略整个measure过程,只在layout函数中传入的4个参数来安排每个子视图的具体位置。
// 获取分辨率
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels; // 当前分辨率 宽度
// 获取传感器管理服务
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// 震动
vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
checkbox xml 布局
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dip"
android:layout_height="25dip"
android:button="@null"
android:gravity="center"
android:background="@drawable/checkboxbg_red"
android:textColor="@color/red"
android:textStyle="bold"/>