厚積方能薄發(fā)
今天我們來個大匯總,列舉一個 Paint 的所有函數(shù),然后一個一個的過。經(jīng)過這幾篇,你將能學會Paint中所有處理函數(shù)的用法。
基本用法
| 函數(shù) | 含義 |
|---|---|
| reset() | 重置畫 |
| setColor(int color) | 給畫筆設(shè)置顏色值 |
| setARGB(int a, int r, int g, int b) | 同樣是設(shè)置顏色,但是利用ARGB分開設(shè)置 |
| setAlpha(int a) | 設(shè)置畫筆透明度 |
| setStyle(Paint.Style style) | 設(shè)置畫筆樣式 |
| setStrokeWidth(float width) | 設(shè)置畫筆寬度 |
| setAntiAlias(boolean aa) | 設(shè)置畫筆是否抗鋸齒 |
上面這些函數(shù)我們都講過,下面來看看一些新的函數(shù)
setStrokeCap(Paint.Cap cap) 設(shè)置線冒樣式,取值有Cap.ROUND(圓形線冒)、Cap.SQUARE(方形線冒)、Paint.Cap.BUTT(無線冒)
setStrokeJoin(Paint.Join join) 設(shè)置線段連接處樣式,取值有:Join.MITER(結(jié)合處為銳角)、Join.Round(結(jié)合處為圓弧)、Join.BEVEL(結(jié)合處為直線)
setStrokeMiter(float miter) 設(shè)置筆畫的傾斜度,90度拿畫筆與30拿畫筆,畫出來的線條樣式肯定是不一樣的吧。(事實證明,根本看不出來什么區(qū)別好嗎……囧……)
setPathEffect(PathEffect effect) 設(shè)置路徑樣式;取值類型是所有派生自PathEffect的子類:ComposePathEffect, CornerPathEffect, DashPathEffect, DiscretePathEffect, PathDashPathEffect, SumPathEffect
這四個函數(shù)中,setStrokeMiter(float miter)就不再講了,我做過試驗,沒什么變化,也就是沒啥屌用……,我們分別來看看另外三個函數(shù)的具體用法。
setStrokeCap(Paint.Cap cap)
設(shè)置線帽樣式,取值有Cap.ROUND(圓形線帽)、Cap.SQUARE(方形線帽)、Paint.Cap.BUTT(無線帽)
我先不講什么叫做線冒,大家先來看看下面這段代碼以及它的效果:
package com.as.customview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
public class PaintView extends View {
public PaintView(Context context) {
this(context, null);
}
public PaintView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setStrokeWidth(120);
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeCap(Paint.Cap.BUTT);
canvas.drawLine(100, 200, 400, 200, paint);
paint.setStrokeCap(Paint.Cap.SQUARE);
canvas.drawLine(100, 400, 400, 400, paint);
paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawLine(100, 600, 400, 600, paint);
paint.reset();
paint.setStrokeWidth(2);
paint.setColor(Color.RED);
canvas.drawLine(100, 50, 100, 750, paint);
canvas.drawLine(400, 50, 400, 750, paint);
}
}
在這里,我們水平畫了三條線,他們的線冒類型分別是Cap.BUTT(無線帽)、Cap.SQUARE(方形線帽)、Cap.ROUND(圓形線冒)
最后,垂直畫出x=100的那條起始線,垂直畫出x=400的那條起始線。

從效果圖中可以明顯看出,從無線冒多出來的那塊區(qū)域就是線帽!就相當于給原來的直線加上一個帽子一樣,所以叫線帽。android的線冒樣式是很少的,只有方形和圓形兩種。
setStrokeJoin(Paint.Join join)
- Join.MITER(結(jié)合處為銳角)
- Join.Round(結(jié)合處為圓弧)
- Join.BEVEL(結(jié)合處為直線)
我們畫出來三個銳角的path,分別給這三段Path設(shè)置不同的連接方式:
Paint paint = new Paint();
paint.setStrokeWidth(60);
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
Path path = new Path();
path.moveTo(100, 100);
path.lineTo(450, 100);
path.lineTo(100, 300);
paint.setStrokeJoin(Paint.Join.MITER);
canvas.drawPath(path, paint);
path.moveTo(100, 400);
path.lineTo(450, 400);
path.lineTo(100, 600);
paint.setStrokeJoin(Paint.Join.BEVEL);
canvas.drawPath(path, paint);
path.moveTo(100, 700);
path.lineTo(450, 700);
path.lineTo(100, 900);
paint.setStrokeJoin(Paint.Join.ROUND);
canvas.drawPath(path, paint);

Join.Round和 Join.BEVEL沒有明顯的區(qū)別
setPathEffect(PathEffect effect)
設(shè)置路徑樣式;取值類型是所有派生自PathEffect的子類
我們一個個來看他們的效果:CornerPathEffect——圓形拐角效果,它的作用就是將原來Path生硬的直線拐角,變成圓形拐角
public CornerPathEffect(float radius)
它只有一個參數(shù)radius:即當前連接兩條直線所使用的圓的半徑。

上面這個圖,很清晰的展示了利用半徑R=50的圓來代替原來兩條直線間的夾角。
我們利用代碼,再來看看具體效果:
Paint paint = new Paint();
paint.setStrokeWidth(4);
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
Path path = new Path();
path.moveTo(100,600);
path.lineTo(400,100);
path.lineTo(660,800);
canvas.drawPath(path,paint);
paint.setColor(Color.RED);
paint.setPathEffect(new CornerPathEffect(100));
canvas.drawPath(path,paint);
paint.setColor(Color.BLUE);
paint.setPathEffect(new CornerPathEffect(200));
canvas.drawPath(path,paint);
在這里,我利用Path構(gòu)造了一個夾角,在同一個位置畫了三遍,第一遍是沒有添加任何PathEffect的;第二遍,CornerPathEffect的圓半徑為100;第三遍CornerPathEffect的圓半徑為200;

很明顯能看出在半徑不同情況下,連接位置也是不一樣的。
DashPathEffect——虛線效果
它的函數(shù)聲名如下:
public DashPathEffect(float intervals[], float phase)
intervals[]:表示組成虛線的各個線段的長度;如果我們定義intervals[]為new float[] {20,10,100,100};那么這條虛線將是由四條子線段循環(huán)組成的,第一條實線長度為20,第二個空線長度為10,第三個實線長為100,第四條空線長充為100;長度必須大于等于2;因為必須有一個實線段和一個空線段來組成虛線。個數(shù)必須為偶數(shù),如果是基數(shù),最后一個數(shù)字將被忽略;這個很好理解,因為一組虛線的組成必然是一個實線和一個空線成對組成的。
phase:開始繪制的偏移值
我們來看看代碼的運行效果來驗證我們想的是否正確:
Paint paint = getPaint();
Path path = new Path();
path.moveTo(100, 600);
path.lineTo(400, 100);
path.lineTo(700, 900);
canvas.drawPath(path, paint);
paint.setColor(Color.RED);
//使用DashPathEffect畫線段
paint.setPathEffect(new DashPathEffect(new float[]{20, 10, 100, 100}, 0));
canvas.translate(0, 100);
canvas.drawPath(path, paint);
//畫同一條線段,偏移值為15
paint.setPathEffect(new DashPathEffect(new float[]{20, 10, 50, 100}, 15));
paint.setColor(Color.BLUE);
canvas.translate(0, 100);
canvas.drawPath(path, paint);
其中把paint封裝成一個getPaint方法來獲取基本的畫筆設(shè)置。
private Paint getPaint(){
Paint paint = new Paint();
paint.setStrokeWidth(4);
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
return paint;
}

從這個效果圖中可以看到兩點:
第一:紅線段的基本組成部分,分別長度為20,10,100,100實線段和空線段組成的
第二:黃線段位移了15,從開始處就可以明顯看出效果。原來20的線段,只剩5,所以看起來就像一個點一樣。
DiscretePathEffect——離散路徑效果
同樣,圖中第一條線是原生的,第二條線加上離散路徑效果后的樣式。
DiscretePathEffect就是將原來路徑分隔成定長的線段,然后將每條線段隨機偏移一段位置,我們可以用它來模擬一種類似生銹鐵絲的效果;
它的構(gòu)造函數(shù)如下:
public DiscretePathEffect(float segmentLength, float deviation)
第一個參數(shù)segmentLength:表示將原來的路徑切成多長的線段。如果值為2,那么這個路徑就會被切成一段段由長度為2的小線段。所以這個值越小,所切成的小線段越多;這個值越大,所切成的小線段越少。
第二參數(shù)deviation:表示被切成的每個小線段的可偏移距離。值越大,就表示每個線段的可偏移距離就越大,就顯得越凌亂,值越小,每個線段的可偏移原位置的距離就越小。
我們看下代碼效果: