一,事件坐標系
即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繪制坐標系統。