1. View的介绍
Android里View就是一个矩形窗体的抽象, ViewGruop就是view容器抽象。简单看下view坐标表示
说明:
a) view获取自身坐标:getLeft(),getTop(),getRight(),getBottom()获取到的值都是相对父容器的坐标。
b) view获取宽高getHeight(),getWidth()
2. View的主要方法介绍
一个view的要合理在父容器里绘制出来,首先我们要知道View的大小; 其次要知道View的摆放位置; 最后要把View特定形状画出来。View里onMeasure() 负责测绘大小、
onLayout()负责组件的摆放、 onDraw()负责具体的绘制。
2.1 onMeasure介绍
onMeasure(int widthMeasureSpec, intheightMeasureSpec);
a)该方法主要负责测量组建的大小的。widthMeasureSpec和widthMeasureSpec都是一个32位整形的值,例如widthMeasureSpec前两位代表控件的绘画模式,后三十位代表控件的宽度的值。获取到宽度的大小int width =MeasureSpec.getSize(widthMeasureSpec);
int widthModel=MeasureSpec.getMode(widthMeasureSpec);获取到宽度的大小
b)根据模式和大小合理决定宽高
三种模式是:[例如以width举例]
EXACTLY: 精确模式,就是android:layout_width设置了具体值的,例如属性配置的是400dp或者match_parent.
AT_MOST:最大适配模式,就是配置android:layout_width是wrap_context.
UNSPECIFIED: 未指定模式,就是android:layout_width没有设置值的
例如系统获取到组件的模式是EXACTLY,直接宽度是width,如果是wrap_context或者是未指定,就需要根据具体的绘画内容设置宽度的默认值。
c)设置具体的大小
根据模式和大小,合理的测绘出宽高的时候,要把宽高设置下
setMeasuredDimension(intmeasuredWidth,int measuredHeight);
2.2 onLayout方法
onLayout(boolean changed, int l, int t, int r, int b);
该方法主要是摆放子View在父控件的合理位置.l:就是父组件里的左边距; t:就是顶边距;r:就是右边距;b:就是底边距。注意设置一些控件的父边距要在这里边体现,就是android:layout_marginxxx系列的属性。
2.3 onDraw
onDraw(Canvas canvas);
这个就是根据具体的控件内形,在控件内绘制具体的效果。设置一些控件内边距在绘画的时候会用到。就是android:paddingXXX.
3. View常用的方法:
a) 重新刷新界面 invalidate(),其实就是调用View的onDraw()方法。
b) 重新测绘和摆放位置: requestLayout(),例如子组件有删除的时候,底层就会调用。
c) View释放一些数据的时候:onDetachedFromWindow();
d) 在Activity里获取View的大小:onwindowfocuschanged()里获取View的大小,在别的方法里获取的时候,会存在View可能还没有测绘完成。
4. ViewGroup的距离说明LinearLayout:
4.1:onMeasure():
测绘大小的时候, EXACTLY模式的话指定使用设置的大小,如果是AT_MOST,就需要遍历每一个子控件,获取到每一个子控件的大小,最总才能决定控件的大小。
4.2: onLayout().
会根据设置的方向,比如是横向的,就会依次把每一个子控件合理的摆放到水平位置。
4.3 onDraw():
先要绘制LinearLayout自己的东西,比如背景,在依次调用子控件的绘制。