View工作原理

来源:互联网 发布:sql loader语法 编辑:程序博客网 时间:2024/05/21 06:40
  • measure过程决定View的宽/高,measure完成后,可以通过getMeasuredWidth和getMeasuredHeight获取View测量后的宽/高;
  • layout过程决定View四个顶点的坐标和实际的宽和高,layout完成后,可以通过getLeft,getTop等方法获得四个顶点的位置和getWidth,getHeight方法获得View实际的高度和宽度;

    View的MeasureSpec由LayoutParams和父容器的MeasureSpec共同决定;DecorView由自身的LayoutParams和窗口的尺寸共同确定:

  • 当View采用固定宽/高的时候,不管父容器的MeasureSpec是什么,View的MeasureSpec都是精确模式,大小遵循LayoutParams中的大小;
  • 当View采用match_parent时,如果父容器的MeasureSpec是精确模式,View的MeasureSpec也是精确模式,大小是父容器的剩余空间;如果父容器的MeasureSPec是最大模式,View的MeasureSpec也是最大模式,大小不超过父容器的剩余空间;
  • 当View采用wrap_content时,不管父容器的MeasureSpec是什么,View的MeasureSpec都是最大模式,并且大小不超过父容器的剩余控件;

    获取测量宽高的四种方法:

    1. 在Activity的onWindowFocusChanged方法中获取,该方法在窗口得到焦点和失去焦点的时候均会被调用;
    2. view.post(runnable)。通过post将一个Runnable投递到消息队列尾部,等待Looper调用此Runnable时,View已经初始化好了
    3. 使用ViewTreeObserver的回调接口,比如OnGlobalLayoutListener接口
    4. view.measure(widthMeasureSpec,heightMeasureSpec)分别创建宽度和高度的测量规则手动测量,当LayoutParams为match_parent时,无法测量

    自定义View:需要重写onMeasure方法,以支持wrap_content属性,padding属性在onDraw方法中处理,margin由ViewGroup处理;

当包含此View的Activity退出或者当前View被remove时,View的onDetachedFromWindow方法会被调用。

0 0