經常使用自定義 View 方法彙總 Paint 類 (二)

paint 類

1. 顏色相關

1.1 設置顏色

setColor(int color);
setARGB(int a, int r, int g, int b);
複製代碼

1.2 設置着色器

setShader(Shader shader);
複製代碼

注:設置後,setColor/ARGB() 方法無效。canvas

1.2.1 LinearGradient 線性漸變着色器

// x0 y0 x1 y1:漸變的兩個端點的位置
// color0 color1 是端點的顏色
// tile:端點範圍以外的着色規則
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile);
複製代碼

1.2.2 RadialGradient 輻射漸變 從中心向周圍輻射狀的漸變

// centerX centerY:輻射中心的座標
// radius:輻射半徑
// edgeColor:輻射邊緣的顏色
// tileMode:輻射範圍以外的着色模式。
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode);
複製代碼

1.2.3 SweepGradient 掃描漸變。

// cx cy :掃描的中心
// color0:掃描的起始顏色
// color1:掃描的終止顏色
SweepGradient(float cx, float cy, int color0, int color1);
複製代碼

着色規則:數組

  • CLAMP 會在端點以外延續端點處的顏色;
  • MIRROR 是鏡像模式;
  • REPEAT 是重複模式。

1.2.4 BitmapShader 圖片着色器。

// bitmap:用來作模板的 Bitmap 對象
// tileX:橫向的 TileMode
// tileY:縱向的 TileMode。
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY);
複製代碼

1.2.5 ComposeShader 混合着色器 把兩個 Shader 一塊兒使用。

// shaderA, shaderB:兩個相繼使用的 Shader
// mode: 兩個 Shader 的疊加模式,即 shaderA 和 shaderB 應該怎樣共同繪製。
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode);
複製代碼

例:bash

// 第二個 Shader:從上到下的線性漸變(由透明到黑色)
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.batman_logo);
Shader shader2 = new BitmapShader(bitmap2, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
// ComposeShader:結合兩個 Shader
Shader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.SRC_OVER);
paint.setShader(shader);
...
canvas.drawCircle(300, 300, 300, paint);
複製代碼

PorterDuff.Mode 顏色策略 一共有 17 個,能夠分爲兩類:

  • Alpha 合成 (Alpha Compositing)
  • 混合 (Blending)

源圖像和目標圖像 post

Alpha 合成:

混合

1.3 設置顏色過濾

// colorFilter顏色過濾類
setColorFilter(ColorFilter colorFilter);
複製代碼

1.3.1 LightingColorFilter 模擬簡單的光照效果

// mul 用來和目標像素相乘
// add 用來和目標像素相加
LightingColorFilter(int mul, int add);
複製代碼

1.3.2 PorterDuffColorFilter 使用一個指定的顏色和一種指定的 PorterDuff.Mode 來與繪製對象進行合成。

PorterDuffColorFilter(int color, PorterDuff.Mode mode);
複製代碼

1.3.3 ColorMatrixColorFilter 使用一個 ColorMatrix 來對顏色進行處理。

複製代碼

可以使用 setSaturation(float sat);設置飽和度。ui

1.4 Xfermode

指的是你要繪製的內容和 Canvas 的目標位置的內容應該怎樣結合計算出最終的顏色。但通俗地說,其實就是要你以繪製的內容做爲源圖像,以 View 中已有的內容做爲目標圖像,選取一個 PorterDuff.Mode 做爲繪製內容的顏色處理方案。spa

例:3d

Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
...
canvas.drawBitmap(rectBitmap, 0, 0, paint); // 畫方
paint.setXfermode(xfermode); // 設置 Xfermode
canvas.drawBitmap(circleBitmap, 0, 0, paint); // 畫圓
paint.setXfermode(null); // 用完及時清除 Xfermode
複製代碼

使用注意rest

  • 使用離屏緩衝(Off-screen Buffer)

Canvas.saveLayer();code

int saved = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
canvas.drawBitmap(rectBitmap, 0, 0, paint); // 畫方
paint.setXfermode(xfermode); // 設置 Xfermode
canvas.drawBitmap(circleBitmap, 0, 0, paint); // 畫圓
paint.setXfermode(null); // 用完及時清除 Xfermode
canvas.restoreToCount(saved);
複製代碼

View.setLayerType()cdn

複製代碼

總結:

2. 繪製相關的設置

2.1 設置繪製模式

// FILL 是填充模式,
// STROKE 是畫線模式(即勾邊模式)
// FILL_AND_STROKE 是兩種模式一併使用:既畫線又填充。
// 它的默認值是 FILL,填充模式。
setStyle(Paint.Style style);
複製代碼

2.1 設置線條的寬度,在 STROKE 和 FILL_AND_STROKE 下

// width 寬度,單位像素
setStrokeWidth(float width);
複製代碼

2.2 設置線頭的形狀

// BUTT 平頭、ROUND 圓頭、SQUARE 方頭
setStrokeCap(Paint.Cap cap);
複製代碼

2.3 設置拐角的形狀

// MITER 尖角、 BEVEL 平角和 ROUND 圓角
settrokeJoin(Paint.Join join);
複製代碼

2.4 拐角的補償

對 setStrokeJoin() 的補充,設置 MITER 拐角的延長線的最大值。 線條在 Join 類型爲 MITER 時對於 MITER 的長度限制。

setStrokeMiter(float miter);
複製代碼

2.5 設置抗鋸齒

setAntiAlias(boolean aa);
//或在new Paint()的時添加 ANTI_ALIAS_FLAG參數;
複製代碼

2.6 設置圖像抖動

圖像從較高色彩深度(便可用的顏色數)向較低色彩深度的區域繪製時,在圖像中有意地插入噪點,經過有規律地擾亂圖像來讓圖像對於肉眼更加真實的作法。

setDither(boolean dither);
複製代碼

2.7 是否使用雙線性過濾來繪製 Bitmap 。

setFilterBitmap(boolean filter);
複製代碼

2.8 設置輪廓效果

// effect 輪廓效果
setPathEffect(PathEffect effect);
複製代碼

2.8.1 CornerPathEffect 拐角變圓角

// radius 是圓角的半徑
CornerPathEffect(float radius);
複製代碼

PathEffect pathEffect = new CornerPathEffect(20);
paint.setPathEffect(pathEffect);
canvas.drawPath(path, paint);
複製代碼

2.8.2 DiscretePathEffect 線條進行隨機的偏離,讓輪廓變得亂七八糟。

// segmentLength 是用來拼接的每一個線段的長度
// deviation 是偏離量
DiscretePathEffect(float segmentLength, float deviation);
複製代碼

PathEffect pathEffect = new DiscretePathEffect(20, 5);
paint.setPathEffect(pathEffect);
canvas.drawPath(path, paint);
複製代碼

  • DiscretePathEffect 線條進行隨機的偏離,讓輪廓變得亂七八糟。
// ntervals 指定了虛線的格式:數組中元素必須爲偶數(最少是 2 個)
// phase 虛線的偏移量
DashPathEffect(float[] intervals, float phase);
複製代碼

PathEffect pathEffect = new DashPathEffect(new float[]{20, 10, 5, 10}, 0);
paint.setPathEffect(pathEffect);
canvas.drawPath(path, paint);
複製代碼

2.8.3 PathDashPathEffect 用 Path 來繪製虛線

// shape 參數是用來繪製的 Path
// advance 是兩個相鄰的 shape 段之間的間隔,不過注意,這個間隔是兩個 shape 段的起點的間隔,而不是前一個的終點和後一個的起點的距離;
// phase 虛線的偏移
// style 指定拐彎改變的時候 shape 的轉換方式
PathDashPathEffect(Path shape, float advance, float phase, PathDashPathEffect.Style style);
複製代碼

style 類型

  • TRANSLATE:位移
  • ROTATE:旋轉
  • MORPH:變體

2.8.4 SumPathEffect 組合效果 分別使用

PathEffect dashEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discreteEffect = new DiscretePathEffect(20, 5); 
pathEffect = new SumPathEffect(dashEffect, discreteEffect);
canvas.drawPath(path, paint);
複製代碼

2.8.5 ComposePathEffect 組合效果 組合使用

// innerpe 是先應用的
// outerpe 是後應用的
ComposePathEffect(PathEffect outerpe, PathEffect innerpe);
複製代碼
PathEffect dashEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discreteEffect = new DiscretePathEffect(20, 5); 
pathEffect = new ComposePathEffect(dashEffect, discreteEffect);
...
canvas.drawPath(path, paint);
複製代碼

2.9 設置陰影效果

// radius 是陰影的模糊範圍; 
// dx dy 是陰影的偏移量; 
// shadowColor 是陰影的顏色。
setShadowLayer(float radius, float dx, float dy, int shadowColor)
複製代碼

清除陰影層,使用 clearShadowLayer();

2.10 繪製層上方的附加效果

setMaskFilter(MaskFilter maskfilter);
複製代碼

2.10.1 MaskFilter BlurMaskFilter 模糊效果

// radius 模糊的範圍, 
// style 是模糊的類型
BlurMaskFilter(float radius, BlurMaskFilter.Blur style);
複製代碼

模糊類型

  • NORMAL: 內外都模糊繪製
  • SOLID: 內部正常繪製,外部模糊
  • INNER: 內部模糊,外部不繪製
  • OUTER: 內部不繪製,外部模糊(什麼鬼?)

2.10.2 浮雕效果

// direction  3 個元素的數組,指定了光源的方向; 
// ambient 環境光的強度,數值範圍是 0 到 1; 
// specular 炫光的係數; 
// blurRadius 應用光線的範圍
EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius);
複製代碼

例:

paint.setMaskFilter(new EmbossMaskFilter(new float[]{0, 1, 1}, 0.2f, 8, 10));
...
canvas.drawBitmap(bitmap, 100, 100, paint);
複製代碼

3. 其餘

3.1 獲取繪製的 path

// src 是原 Path
// dst 實際 Path 的保存位置
getFillPath(Path src, Path dst);
複製代碼

3.2 重置 Paint 的全部屬性爲默認值

reset();
複製代碼

3.3 把 src 的全部屬性所有複製過來

set(Paint src);
複製代碼

3.4 批量設置 flags。至關於依次調用它們的 set 方法

setFlags(int flags);
複製代碼

注: 文章參考:HenCoder Android 開發進階: 自定義 View 1-2 Paint 詳解

相關文章
相關標籤/搜索