自定义view总结

165 阅读1分钟

本总结图文参考来源于任玉刚的艺术探索书

View的坐标系

系统坐标系: 以手机坐上角为(0,0),X轴向右, y轴向下

view的位置参数: 有left,right,top,bottom, x,y,translationX, translationY参数。其坐标是相对父容器的相对坐标系;

x = left + translationX;
y = top + translationY;

letf,top是相对父容器的初始坐标,发生平移以后值不变; x, y 是相对父容器的坐标,未发生平移分别和lef,top等同,发生平移以后,坐标计算如上面的公式。

eg:

View 绘制流程

view的绘制流程从ViewRoot的performTraversals开始。在Activity被创建完毕,DecorView被添加到Window中,同时会创建viewRootImpl对象并和DecorView建立关联。

measure: 决定view的宽高 layout: 决定view的坐标 draw: 绘画view

MeasureSpec

在view的绘画过程中,测量view的宽高是由系统根据LayoutParams以及父容器的约束转换成MeasureSpec,然后根据MeasureSpec来测量view的宽高度

MeasureSpec 类中由三种SpecMode,每一种状态都可以和LayoutParams对应起来

public static final int AT_MOST = -2147483648; 表示view的宽高受到父容器的约束,但是view的宽高未设置指定值,对应LayoutParams的WARP_CONTENT
public static final int EXACTLY = 1073741824; 表示view的宽高度是指明的,但是依然受父容器的约束
public static final int UNSPECIFIED = 0; 表示view的宽高度不受父容器的约束