setColor(int color);
setARGB(int a, int r, int g, int b);
複製代碼
setShader(Shader shader);
複製代碼
注:設置後,setColor/ARGB() 方法無效。canvas
// x0 y0 x1 y1:漸變的兩個端點的位置
// color0 color1 是端點的顏色
// tile:端點範圍以外的着色規則
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile);
複製代碼
// centerX centerY:輻射中心的座標
// radius:輻射半徑
// edgeColor:輻射邊緣的顏色
// tileMode:輻射範圍以外的着色模式。
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode);
複製代碼
// cx cy :掃描的中心
// color0:掃描的起始顏色
// color1:掃描的終止顏色
SweepGradient(float cx, float cy, int color0, int color1);
複製代碼
着色規則:數組
// bitmap:用來作模板的 Bitmap 對象
// tileX:橫向的 TileMode
// tileY:縱向的 TileMode。
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY);
複製代碼
// 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 個,能夠分爲兩類:
源圖像和目標圖像 post
// colorFilter顏色過濾類
setColorFilter(ColorFilter colorFilter);
複製代碼
// mul 用來和目標像素相乘
// add 用來和目標像素相加
LightingColorFilter(int mul, int add);
複製代碼
PorterDuffColorFilter(int color, PorterDuff.Mode mode);
複製代碼
複製代碼
可以使用 setSaturation(float sat);設置飽和度。ui
指的是你要繪製的內容和 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
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
複製代碼
// FILL 是填充模式,
// STROKE 是畫線模式(即勾邊模式)
// FILL_AND_STROKE 是兩種模式一併使用:既畫線又填充。
// 它的默認值是 FILL,填充模式。
setStyle(Paint.Style style);
複製代碼
// width 寬度,單位像素
setStrokeWidth(float width);
複製代碼
// BUTT 平頭、ROUND 圓頭、SQUARE 方頭
setStrokeCap(Paint.Cap cap);
複製代碼
// MITER 尖角、 BEVEL 平角和 ROUND 圓角
settrokeJoin(Paint.Join join);
複製代碼
對 setStrokeJoin() 的補充,設置 MITER 拐角的延長線的最大值。 線條在 Join 類型爲 MITER 時對於 MITER 的長度限制。
setStrokeMiter(float miter);
複製代碼
setAntiAlias(boolean aa);
//或在new Paint()的時添加 ANTI_ALIAS_FLAG參數;
複製代碼
圖像從較高色彩深度(便可用的顏色數)向較低色彩深度的區域繪製時,在圖像中有意地插入噪點,經過有規律地擾亂圖像來讓圖像對於肉眼更加真實的作法。
setDither(boolean dither);
複製代碼
setFilterBitmap(boolean filter);
複製代碼
// effect 輪廓效果
setPathEffect(PathEffect effect);
複製代碼
// radius 是圓角的半徑
CornerPathEffect(float radius);
複製代碼
例
PathEffect pathEffect = new CornerPathEffect(20);
paint.setPathEffect(pathEffect);
canvas.drawPath(path, paint);
複製代碼
// segmentLength 是用來拼接的每一個線段的長度
// deviation 是偏離量
DiscretePathEffect(float segmentLength, float deviation);
複製代碼
例
PathEffect pathEffect = new DiscretePathEffect(20, 5);
paint.setPathEffect(pathEffect);
canvas.drawPath(path, paint);
複製代碼
// 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);
複製代碼
// shape 參數是用來繪製的 Path
// advance 是兩個相鄰的 shape 段之間的間隔,不過注意,這個間隔是兩個 shape 段的起點的間隔,而不是前一個的終點和後一個的起點的距離;
// phase 虛線的偏移
// style 指定拐彎改變的時候 shape 的轉換方式
PathDashPathEffect(Path shape, float advance, float phase, PathDashPathEffect.Style style);
複製代碼
style 類型
PathEffect dashEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discreteEffect = new DiscretePathEffect(20, 5);
pathEffect = new SumPathEffect(dashEffect, discreteEffect);
canvas.drawPath(path, paint);
複製代碼
// 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);
複製代碼
// radius 是陰影的模糊範圍;
// dx dy 是陰影的偏移量;
// shadowColor 是陰影的顏色。
setShadowLayer(float radius, float dx, float dy, int shadowColor)
複製代碼
清除陰影層,使用 clearShadowLayer();
setMaskFilter(MaskFilter maskfilter);
複製代碼
// radius 模糊的範圍,
// style 是模糊的類型
BlurMaskFilter(float radius, BlurMaskFilter.Blur style);
複製代碼
模糊類型
// 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);
複製代碼
// src 是原 Path
// dst 實際 Path 的保存位置
getFillPath(Path src, Path dst);
複製代碼
reset();
複製代碼
set(Paint src);
複製代碼
setFlags(int flags);
複製代碼