Paint 1-2 详解 小结

读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);  

猜你喜欢

转载自blog.csdn.net/a136447572/article/details/80259738
今日推荐