3.1Android控件架构

一、关于setContentView( ):

1.每一个Activity都包含了一个window对象,在安卓中window对象通常用phonewindow来实现,PhoneWindow将DecorView设置为整个应用的根View,
2.DecorView作为窗口的顶层view,封装了一些窗口操作的通用方法,可以说DecorView将要显示的内容呈现在PhoneWindow上,其所有的view的监听事件都是由WindowManagerService来进行接受,并通过Activity的对象来调用onClickListener。在显示上分为两部分(TitleView,ContentView)

3.1Android控件架构_第1张图片
1.jpg

二、关于view的测量:

1.Android的view绘制提供了一个MeasureSpec类,通过它可以帮助我们测量View,MeasureSpec本身是一个32位的int值,高2位代表模式,低30位代表测量大小。测量模式分为以下三种:

-->A.EXACTLY----精确值(具体的dp/px或者是match_parent)
-->B.AT_MOST---最大模式(宽和高都是wrap_content)
-->C.UNSPECIFIED--要多大给多大,通常是在自定义view时候才使用。

2.View类默认onMeasure()只支持EXACTLY模式,即可以具体数值或者是match_parent。若view属性是wrap_content则必须重写onMeasure()方法。

-->3.onMeasure()方法中如何进行测量:

   protected void onMeasure(int widthMeasureSpec , int heightMeasureSpec){
           setMeasureDimession( measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));
   }
   private void measureWidht(int widthMeasureSpec){
                int result = 0;
                int widthSpec = MeasureSpec.getMode(widthMeasureSpec);
                int width = MeasureSpec.getWidth(widthMeasureSpec);
                if(widthSpec == MeasureSpec.EXACTLY){
                           result = width;
                     }else{
                      result =200;
                       if(widthSpec == MeasureSpec.AT_MOST){
                                result = Math.min(result,width)
                           }
                 }     
 } 
3.mesureHeight()方法和measureWidht()类似,使用时直接参考measureWidth()方法。

三、关于View的绘制:

1.在onMeasure中得到了view的大小,需要显示出来可以重写ondraw()方法。ondraw()方法中有Canvas mCanvas 参数,而在其他地方需要创建一个Canvas对象。
  Canvas mCanvas  = new Canvas(Bitmap)
2.之所以在上边创建对象时传入一个Bitmap 对象是为了将bitmap与画布创建的bitmap紧密联系在一起,这个bitmap可以用来存储canvas上所有的信息。即mCanvas.drawxxx()信息都会保存在传入的那张bitmap里。
3.在ondraw()方法里也可以实现该效果,即在onDraw()方法中绘制两个bitmap
   mCanvas(bitmap1,0,0,null);
   mCanvas(bitmap2,0,0,null);
对于bitmap2装载到一个新的mCanvas中即:
   Canvas  mCanvas = new Canvas (bitmap2)
在其他地方调用mCanvas方法即可在保存当下所画的信息。

四、ViewGroup的测量与绘制:

1.ViewGroup会管理子view的大小,当ViewGroup属性为wrap_content时会遍历每一个子View(),并且调用子view的measure()方法得到其值。
2.当子View绘制完毕后,需要对view进行位置处理,这个过程是view的layout过程。ViewGroup在执行layout时候同样会调用子view的layout方法,来决定子view的位置。
3.当自定义ViewGroup时候是需要重写onLayout()方法的,若其属性为wrap_content时,同样必须重写onMeasure()方法,这一点上和自定义view类似。

你可能感兴趣的:(3.1Android控件架构)