读Hencoder大神文章,记录笔记
http://hencoder.com/ui-1-2/
1-3 paint.drawText()
https://blog.csdn.net/a136447572/article/details/80289811
1 颜色
1.1 基本颜色
1.1.1 直接设置颜色
1.1.1.1 setColor(int color)
1.1.1.2 setARGB(int a, int r, int g, int b)
1.1.2 setShader(Shader shader) 设置 Shader
1.1.2.1 LinearGradient 线性渐变
Shader shader = new LinearGradient(100, 100, 500, 500, Color.parseColor("#E91E63"),
Color.parseColor("#2196F3"), Shader.TileMode.CLAMP);
paint.setShader(shader);
...
canvas.drawCircle(300, 300, 200, paint);
1.1.2.2 RadialGradient 辐射渐变
Shader shader = new RadialGradient(300, 300, 200, Color.parseColor("#E91E63"),
Color.parseColor("#2196F3"), Shader.TileMode.CLAMP);
paint.setShader(shader);
...
canvas.drawCircle(300, 300, 200, paint);
1.1.2.3 SweepGradient 扫描渐变
Shader shader = new SweepGradient(300, 300, Color.parseColor("#E91E63"),
Color.parseColor("#2196F3"));
paint.setShader(shader);
...
canvas.drawCircle(300, 300, 200, paint);
1.1.2.4 BitmapShader
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.batman);
Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
...
canvas.drawCircle(300, 300, 200, paint);
1.1.2.5 ComposeShader 混合着色器
// 第一个 Shader:头像的 Bitmap
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.batman);
Shader shader1 = new BitmapShader(bitmap1, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
// 第二个 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
1.2 setColorFilter(ColorFilter colorFilter)
/* 很牛逼的功能 ,不过有点难 用的可能会相对少一些*/
1.2.1 LightingColorFilter
ColorFilter lightingColorFilter = new LightingColorFilter(0x00ffff, 0x000000);
paint.setColorFilter(lightingColorFilter);
1.2.2 PorterDuffColorFilter
1.2.3 ColorMatrixColorFilter
1.3 setXfermode(Xfermode xfermode)
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 注意事项
1. 使用离屏缓冲(Off-screen Buffer)
Canvas.saveLayer()
View.setLayerType()
2. 控制好透明区域
2 效果
2.1 setAntiAlias (boolean aa) 设置抗锯齿
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
2.2 setStyle(Paint.Style style)
paint.setStyle(Paint.Style.FILL); // FILL 模式,填充
canvas.drawCircle(300, 300, 200, paint);
paint.setStyle(Paint.Style.STROKE); // STROKE 模式,画线
canvas.drawCircle(300, 300, 200, paint);
paint.setStyle(Paint.Style.FILL_AND_STROKE); // FILL_AND_STROKE 模式,填充 + 画线
canvas.drawCircle(300, 300, 200, paint);
2.3 线条形状
2.3.1 setStrokeWidth(float width)
ColorFilter lightingColorFilter = new LightingColorFilter(0xffffff, 0x003000);
paint.setColorFilter(lightingColorFilter);
2.3.2 setStrokeCap(Paint.Cap cap)
设置线头的形状。线头形状有三种:BUTT 平头、ROUND 圆头、SQUARE 方头。默认为 BUTT。
2.3.3 setStrokeJoin(Paint.Join join)
设置拐角的形状。有三个值可以选择:MITER 尖角、 BEVEL 平角和 ROUND 圆角。默认为 MITER。
2.3.4 setStrokeMiter(float miter)
2.4 色彩优化
2.4.1 setDither(boolean dither)
paint.setDither(true);
2.4.2 setFilterBitmap(boolean filter)
paint.setFilterBitmap(true);
2.5 setPathEffect(PathEffect effect)
PathEffect pathEffect = new DashPathEffect(new float[]{10, 5}, 10);
paint.setPathEffect(pathEffect);
...
canvas.drawCircle(300, 300, 200, paint);
2.5.1 CornerPathEffect
PathEffect pathEffect = new CornerPathEffect(20);
paint.setPathEffect(pathEffect);
...
canvas.drawPath(path, paint);
2.5.2 DiscretePathEffect
PathEffect pathEffect = new DiscretePathEffect(20, 5);
paint.setPathEffect(pathEffect);
...
canvas.drawPath(path, paint);
2.5.3 DashPathEffect
PathEffect pathEffect = new DashPathEffect(new float[]{20, 10, 5, 10}, 0);
paint.setPathEffect(pathEffect);
...
canvas.drawPath(path, paint);
2.5.4 PathDashPathEffect
Path dashPath = ...; // 使用一个三角形来做 dash
PathEffect pathEffect = new PathDashPathEffect(dashPath, 40, 0,
PathDashPathEffectStyle.TRANSLATE);
paint.setPathEffect(pathEffect);
...
canvas.drawPath(path, paint);
TRANSLATE:位移
ROTATE:旋转
MORPH:变体
2.5.5 SumPathEffect
Path dashPath = ...; // 使用一个三角形来做 dash
PathEffect pathEffect = new PathDashPathEffect(dashPath, 40, 0,
PathDashPathEffectStyle.TRANSLATE);
paint.setPathEffect(pathEffect);
...
canvas.drawPath(path, paint);
2.5.6 ComposePathEffect
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.6 setShadowLayer(float radius, float dx, float dy, int shadowColor)
/* 这个阴影比较实用 */、
注意:
在硬件加速开启的情况下, setShadowLayer() 只支持文字的绘制,文字之外的绘制必须关闭硬件加速才能正常绘制阴影。
如果 shadowColor 是半透明的,阴影的透明度就使用 shadowColor 自己的透明度;而如果 shadowColor 是不透明的,阴影的透明度就使用 paint 的透明度。
2.7 setMaskFilter(MaskFilter maskfilter)
2.7.1 BlurMaskFilter
2.7.2 EmbossMaskFilter
paint.setMaskFilter(new EmbossMaskFilter(new float[]{0, 1, 1}, 0.2f, 8, 10));
…
canvas.drawBitmap(bitmap, 100, 100, paint);
2.8 获取绘制的 Path
2.8.1 getFillPath(Path src, Path dst)
2.8.2 getTextPath(String text, int start, int end, float x, float y, Path path) / getTextPath(char[] text, int index, int count, float x, float y, Path path)
3 drawText() 相关
4 初始化类
4.1 reset()
4.2 set(Paint src)
4.3 setFlags(int flags)
paint.setFlags(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
//这行代码,和下面这两行是等价的:
paint.setAntiAlias(true);
paint.setDither(true);