android中view创建过程

 1.在API中对View的回调流程有一个详细的描述,下面给出了原文翻译:

 1.Creation:创建

         1.1----Constructors(构造器) 

在构造器中有一个表单负责View从代码中创建和从Layout File 文件中创建,第二个表单负责解析和应用一些在Layout File中定义的属性。

默认的布局文件调用的是两个参数的构造方法  

1.2---- onFinishInflate()

当View和他的所有子View从XML中解析完成后调用。

 这个是当系统解析XML完成,并且将子View全部添加完成之后调用这个方法,我们通常重写这个方法,在这个方法中查找并获得子View引用

@Override  
protected void onFinishInflate() {   
    mHandle = findViewById(mHandleId);   
    if (mHandle == null) {   
        throw new IllegalArgumentException("The handle attribute is must refer to an"  
                + " existing child.");   
    }   
    mHandle.setOnClickListener(new DrawerToggler());   
         
    mContent = findViewById(mContentId);   
    if (mContent == null) {   
        throw new IllegalArgumentException("The content attribute is must refer to an"  
                + " existing child.");   
    }   
    mContent.setVisibility(View.GONE);   
} 

  1.3-----onAttachedToWindow 

          当view黏附在当前window时调用

         1.4----onWindowVisibilityChanged(int)

在当前window中的view发生改变时调用

 2. Layout  :布局

2.1----onMeasure(int, int)

确定View和它所有的子View要求的尺寸时调用

     测量这个View的高和宽。通过调用这个方法来设置View的测量后的高和宽,其最终调用的方法是:

protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {   
        mMeasuredWidth = measuredWidth;   
        mMeasuredHeight = measuredHeight;   
          
        mPrivateFlags |= MEASURED_DIMENSION_SET;   
    }  

可见其最终是将高和宽保存在mMeasuredWidth、mMeasuredHeight这两个参数中。

       其实调用onMeasure(int, int)的方法的不是系统,而是 public final voidmeasure(int widthMeasureSpec, int heightMeasureSpec)


2.2----onLayout(boolean, int, int,int, int)

当这个View为其所有的子View指派一个尺寸和位置时调用

2.3---- onSizeChanged(int, int, int,int)

当这个View的尺寸改变后调用

  3. Drawing :绘制

3.1---- onDraw(Canvas)

当View渲染其内容时调用

4.Event processing :事件流程

4.1----onKeyDown(int, KeyEvent)

当一个新的键按下时

4.2 ---- onKeyUp(int, KeyEvent)  

当一个键弹起时

4.3----onTrackballEvent(MotionEvent)

当滚迹球事件发生时。

4.4----onTouchEvent(MotionEvent)

当一个触摸屏事件发生时。

5.Focus  :焦点

5.1 ---- onFocusChanged(boolean, int,Rect)

当View得到和失去焦点时调用

5.2---- onWindowFocusChanged(boolean)

当Window包含的View得到或失去焦点时调用。

6.Attaching 依赖onWindowVisibilityChanged(int)

6.1----onWindowVisibilityChanged(int)

在当前window中的view发生改变时调用

6.2----onDetachedFromWindow()

当view从当前window去掉时调用


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章