一,事件坐标系
即MotionEvent事件下发的坐标系,其坐标轴如下
MotionEvent#offsetLocation方法可调整坐标原点,以影响MotionEvent#getX,MotionEvent#getY值,以匹配子View的坐标参考系,进而进行事件处理。注意,offsetLocation是累加方法,
offsetLocation在ViewGroup#onTouch-->dispatchTouchEvent-->dispatchTransformedTouchEvent中进行调整并下发到子View,如下
dispatchTransformedTouchEvent翻译即转换坐标系后的事件。
核心方法即此处,通过child#left、top以及滚动x、y,调整坐标原点,随后将此MotionEvent下发至child,再通过offsetX、offsetY还原至当前View坐标系,以适应handled返回false后,需Parent继续处理的情况。
二,绘制坐标系
与事件坐标系一样,绘制Cavans绘制的坐标系,其坐标轴如下,
即以左上为中心点,通过Cavans#drawXXX(x,y)实现指定区域绘制。
此坐标原点可通过Cavans#translate方法平移变化。即,如果系统从没调用过Cavans#translate方法,绘制坐标原点则默认是屏幕左上角区域。而对于每个View,在onDraw中传入的Cavans绘制,坐标原点是当前View左上角,这是怎么实现的呢?
很简单,View#draw方法通过当前View的Layout,预处理了坐标原点。
ViewGroup调用View#draw方法,注意,这是三个参数的draw
此处可暂忽略HWI RenderNode,只需明白,在translate坐标原点后,View再次调用了一个参数draw方法,进而调用到onDraw,其传入的Canvas,原点已经经过了绘制VIew修正。
当View绘制完毕时,对于Parent View,则需要将坐标原点还原至前一个位置,这个通过Cavans#restoreToCount方法实现,其传入的restoreCount则可在translate前通过Cavans#save方法获取,
以上,即View绘制坐标系统。