Android Paint之函數(shù)大匯總

厚積方能薄發(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:表示被切成的每個小線段的可偏移距離。值越大,就表示每個線段的可偏移距離就越大,就顯得越凌亂,值越小,每個線段的可偏移原位置的距離就越小。
我們看下代碼效果:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容