onMeasure 是递归查询 ,逐渐向上查询 ,最后调用到root的onMeasure,onMeasure本身的作用就是告诉父亲自己占用多大的位置,根据递归原理,onMeasure的确应该从下往上层调用
统计完大小后,开始调用onSizeChange,调用onSizeChange是从root开始的,然后逐级调用到child,调用每个child的onSizeChange完毕后,每个child执行layout动作
子child的onlayout调用开始,最后调用到root的onlayout方法。因为只有大小发生了变化才会执行onSizeChange,所以没有onSizeChange的时候,就是从尾到头执行完onmeasure,再开始从尾到头执行完onlayout
在编写android的自定义控件,或者判断用户手势操作时,往往需要使用MotionEvent中的getRawX()、getRawY()与getX()、getY()取得触摸点在X轴与Y轴上的距离,这四个方法都返回一个float类型的参数,单位为像素(Pixel)。getRawX()、getRawY()返回的是触摸点相对于屏幕的位置,而getX()、getY()返回的则是触摸点相对于View的位置。
View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是把某个View的位置进行改变
scrollTo(int x, int y) 是将View中内容滑动到相应的位置,参考的坐标系原点为parent View的左上角。
调用scrollTo(100, 0)表示将View中的内容移动到x = 100, y = 0的位置,如下图所示。注意,图中黄色矩形区域表示的是一个parent View,绿色虚线矩形为parent view中的内容。一般情况下两者的大小一致,本文为了显示方便,将虚线框画小了一点。图中的黄色区域的位置始终不变,发生位置变化的是显示的内容
scrollTo(0, 100)的效果如下图所示:
ScrollX,ScrollY的时候,组件相对于父组件的位置其实是不变的,改变的是组建内部内容相对于View的位置,对于TextView来说内容是它的文字,对于ViewGroup来说是子组件,因为改变Scroll的值会导致传递的Canvas的原点位置的迁移,改变ViewGroup的scrollX,ScrollY,导致传递到所有的子View的canvas的原点的改变。相对来说ViewGroup的内容区域就是所有的子View