網路測速全解析之一:自定義View基礎知識(一)
效果如圖:
一、基礎知識:
基礎知識,也就是最基本的自定義view需要掌握的知識,我這裡主要是學習了GcsSloop大佬的view自定義系列部落格(這裡是部落格地址)
1.自定義view繪製流程呼叫鏈
2.android自定義座標系(向右向下為正)
所以螢幕顯示部分座標系如下:
子控制元件和父控制元件的關係:
MotionEvent中:
getLeft、getTop、getRight、getBottom是相對於view本身距離父控制元件的位置。
getX和getY同理;而getRawX和getRawY則獲得的是相對於螢幕預設座標系的。
3.角度和弧度:
角度是60進位制,弧度是10進位制。
角度增大方向為順時針
4.顏色:
顏色的獲取方式:
Color.argb(alpha, red, green, blue);
5.分類與流程:
sloop分類方法:ViewGroup和View兩類
a.view 的建構函式(四種),內部實現其實最後都會呼叫第四個
但是後面的兩個引數一般不怎麼用,一般主要用前面兩個,而這兩個的區別主要是呼叫的地方不同,目的不一樣。
b.測量View的大小(onMeasure)
主要是為了取出準確的寬高值。
三種測量模式:UNSPECIFIED、EXACTLY、AT_MOST
修改view的寬高呼叫setMeasuredDimension方法。
c.確定view的大小(onSizeChanged)
d.View佈局位置的確定(onLayout)
獲得的是相對於父佈局的位置資訊:
e.繪製內容(onDraw):
主要使用Canvas繪製。
自定義View的整體流程:
二、Canvas繪製圖形
1.Canvas常用速查表:
操作型別 | 相關API | 備註 |
繪製顏色 | drawColor, drawRGB, drawARGB | 使用單一顏色填充整個畫布 |
繪製基本形狀 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次為 點、線、矩形、圓角矩形、橢圓、圓、圓弧 |
繪製圖片 | drawBitmap, drawPicture | 繪製點陣圖和圖片 |
繪製文字 | drawText, drawPosText, drawTextOnPath | 依次為 繪製文字、繪製文字時指定每個文字位置、根據路徑繪製文字 |
繪製路徑 | drawPath | 繪製路徑,繪製貝塞爾曲線時也需要用到該函式 |
頂點操作 | drawVertices, drawBitmapMesh | 通過對頂點操作可以使影象形變,drawVertices直接對畫布作用、 drawBitmapMesh只對繪製的Bitmap作用 |
畫布剪裁 | clipPath, clipRect | 設定畫布的顯示區域 |
畫布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次為 儲存當前狀態、 回滾到上一次儲存的狀態、 儲存圖層狀態、 回滾到指定狀態、 獲取儲存次數 |
畫布變換 | translate, scale, rotate, skew | 依次為 位移、縮放、 旋轉、錯切 |
Matrix(矩陣) | getMatrix, setMatrix, concat | 實際上畫布的位移,縮放等操作的都是影象矩陣Matrix, 只不過Matrix比較難以理解和使用,故封裝了一些常用的方法。 |
2.建立畫筆:Paint
3.繪製:
點
直線
矩形
繪製一個矩形至少需要兩個點,一般選擇左上角和右下角的兩個點。
Rect和RectF的不同之處是精度方面,Rect是int精度,RectF是float精度。
圓角矩形
後面的兩個引數rx和ry是x方向和y方向的橢圓的兩個半徑
橢圓
原理是繪製一個矩形的內切圓形
圓
前兩個是圓心座標,第三個是半徑,最後一個是畫筆。
圓弧
startAngle:開始角度
sweepAngle:掃過角度
useCenter:是否使用中心(使用的話就是將圓弧兩個端點和中心連線起來)
畫筆Paint的三種區別:描邊(STROKE)、填充(FILL)、描邊加填充(FILL_ADD_STROKE)