自定义View
2020-03-11 本文已影响0人
zhujunhua
- 无论是measure过程、layout过程还是draw过程,永远都是
从View树的根节点开始测量或计算(即从树的顶端开始),一层一层、一个分支一个分支地进行(即树形递归)
,最终计算整个View树中各个View,最终确定整个View树的相关属性。 - View的位置(left/top/rigth/bottom)是相对于父控件而言的;
- View的位置是通过view.getxxx()函数进行获取:
// 获取view与父控件之间的距离
getTop();
getBottom();
getLeft();
getRigth();
与MotionEvent中 get()和getRaw()的区别:
//get() :触摸点相对于其所在组件坐标系的坐标
event.getX();
event.getY();
//getRaw() :触摸点相对于屏幕默认坐标系的坐标
event.getRawX();
event.getRawY();

- 在默认的屏幕坐标系中角度增大方向为顺时针。(注:在常见的数学坐标系中角度增大方向为逆时针)
- View的测量
在某些情况下,需要多次测量(measure)才能确定View最终的宽/高;
该情况下,measure过程后得到的宽 / 高可能不准确;
此处建议:在layout过程中onLayout()
去获取最终的宽 / 高
测量规格(MeasureSpec
) = 测量模式(mode
) + 测量大小(size
)
子View的MeasureSpec值根据
子View的布局参数(LayoutParams)
和父容器的MeasureSpec值
计算得来的,具体计算逻辑封装在getChildMeasureSpec()
里。

getWidth() ( getHeight())与 getMeasuredWidth() (getMeasuredHeight())获取的宽 (高)有什么区别?
getWidth() / getHeight():获得View
最终
的宽 / 高
getMeasuredWidth() / getMeasuredHeight():获得 View测量
的宽 / 高
参考:
自定义View系列