paint的屬性的設定,其實最終呼叫的是native方法,舉個栗子:
1.paint.setStrokeCap(Cap cap);
我們開啟此方法可以看到具體的實現如下:
public void setStrokeCap(Cap cap) {
nSetStrokeCap(mNativePaint, cap.nativeInt);
}複製程式碼
我們可以看到裡面就呼叫了nSetStrokeCap()方法,這是一個native方法:
我們再來看看setStrokeCap(Cap cap) 中的Cap引數,這個引數有三種型別:BUTT(預設型別)、ROUND(圓角效果)、SQUARE(方角效果),當我沒畫一條直線時,這裡通過一張圖片可以很直白的提現這幾種型別的差別:
2.paint.setStrokeJoin(Paint.Join.MITER);
這個方法是設定畫筆的拐角風格,這裡有三種型別MITER(尖角:預設型別)、ROUND(圓角)、BEVEL(鈍角)三種狀態,同樣我們可以用一張圖來描述這三種型別的區別:
3.paint.getFontMetrics():獲取字型度量物件FontMetrics
下圖介紹的是FontMetrics的集中常用的屬性:
4.Paint顏色相關的屬性:
下面講講使用的Shader的幾個子類:
構造方法1:
LinearGradient(float x0, float y0, float x1, float y1,int color0,int color1,TileMode tile)複製程式碼
引數說明:x0,y0,x1,y1:漸變的兩個端點的位置; color0、color1:兩個端點的顏色,tile:端點範圍之外的著色規則,型別是TileMode.
我們通過以下程式碼實現這個構造方法:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mShader = new LinearGradient(0, 0, 500, 500, Color.RED, Color.BLUE, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
canvas.drawRect(0, 0, 500, 500, mPaint);
}複製程式碼
執行效果:
構造方法2:
LinearGradient(float x0, float y0, float x1, float y1, int colors[],float positions[], TileMode tile)複製程式碼
引數說明:x0,y0,x1,y1:漸變的兩個端點的位置; colors:端點顏色的陣列,position[]:可以為null,例如position[]陣列為{0.5, 1};colors[]陣列為{Color.RED, Color.BLUE},第一個值0.5表示整個線性渲染的比例到50%,這50%的顏色為colors[]陣列中的第一個顏色值Color.RED,1對應colors陣列中的第二個值Color.BLUE,表示當渲染比例到了100%的時候顏色為Color.BLUE。這裡主要如果positions[]不為null的時候,positions[]陣列的長度要與colors[]陣列長度相等,否則會丟擲異常。tile:端點範圍之外的著色規則,型別是TileMode.
我們通過以下程式碼使用這個構造方法:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mShader = new LinearGradient(0, 0, 500, 500,
new int[]{Color.RED, Color.BLUE, Color.GREEN},
new float[]{0f, 0.5f, 1f}, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
canvas.drawRect(0, 0, 500, 500, mPaint);
}複製程式碼
效果如下:
由此可見:0~0.5是Color.RED~Color.BLUE之間的漸變,0.5~1是Color.BLUE~Color.RED之間的漸變。