Android Paint画笔

常用方法

Paint mPaint = new Paint();

mPaint.reset();

mPaint.setColor(Color.RED); /setARGB(int a, int r, int g, int b)

设置透明度

mPaint.setAlpha(255);

mPaint.setStyle(Paint.Style.FILL)
Paint.Style.FILL 填充内容
Paint.Style.STROKE 描边
Paint.Style.FILL_AND_STROKE

设置画笔宽度

mPaint.setStrokeWidth(50)

mPaint.setStrokeCap(Paint.Cap.BUTT)
Paint.Cap.BUTT 没有
Paint.Cap.ROUND 圆形
Paint.Cap.SQUARE

设置线段连接处样式

mPaint.setStrokeJoin(Paint.Join.MITER);
Join.MITER(结合处为锐角)
Join.Round(结合处为圆弧)
Join.BEVEL(结合处为直线)

mPaint.setAntiAlias(true);
会损失一定的性能

设置是否使用图像抖动处理

mPaint.setDither(true);
会使绘制的图片等颜色更加的清晰以及饱满。(也是损失性能)

获得字符行间距

mPaint.getFontSpacing()

获得字符之间的间距

mPaint.getLetterSpacing();

设置字符之间的间距

mPaint.setLetterSpacing(letterSpacing)

设置文本删除线

mPaint.setStrikeThruText(true);

是否设置下划线

mPaint.setUnderlineText(true);

设置文本大小

mPaint.setTextSize(textSize)

获取文本大小

mPaint.getTextSize();

设置字体类型

mPaint.setTypeface(Typeface.BOLD)
Typeface.BOLD 粗体
Typeface.ITALIC 斜体

加载自定义字体

Typeface.create(familyName, style)

设置文字倾斜

mPaint.setTextSkewX(-0.25f);
官方推荐的-0.25f是斜体

文本对齐方式

mPaint.setTextAlign(Align.LEFT)
Align.LEFT 左对齐
Align.CENTER 中间对其
Align.RIGHT 右对齐

计算制定长度的字符串

mPaint.breakText(text, measureForwards, maxWidth, measuredWidth)
text:字符串
measureForwards:boolean
maxWidth:int
measuredWidth:float[] 结果接收

获取文本的矩形区域(宽高)

mPaint.getTextBounds(text, index, count, bounds)
mPaint.getTextBounds(text, start, end, bounds)

获取文本的粗略宽度

mPaint.measureText(str);

得到每一个字符的宽度

mPaint.getTextWidths(str, measuredWidth);
mPaint.getTextWidths(text, start, end, widths) textWidths字符数

设置颜色过滤

setColorFilter(ColorFilter filter)
就像拿个筛子把颜色“滤”一遍获取我们想要的色彩结果
子类有三个:
ColorMatrixColorFilter 色彩矩阵颜色过滤器

ColorMatrix colorMatrix = new ColorMatrix(new float[]{
        1, 0, 0, 0, 0,
        0, 1, 0, 0, 0,
        0, 0, 1, 0, 0,
        0, 0, 0, 1, 0,
mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
其中,第一行表示的R(红色)的向量,
第二行表示的G(绿色)的向量,
第三行表示的B(蓝色)的向量,
最后一行表示A(透明度)的向量,
这个矩阵不同的位置表示的RGBA值,
其范围在0.0F至2.0F之间,1为保持原图的RGB值。
每一行的第五列数字表示偏移值,何为偏移值?
顾名思义当我们想让颜色更倾向于红色的时候就增大R向量中的偏移值,
想让颜色更倾向于蓝色的时候就增大B向量中的偏移值

LightingColorFilter
LightingColorFilter (int mul, int add)
mul全称是colorMultiply意为色彩倍增,而add全称是colorAdd意为色彩添加,这两个值都是16进制的色彩值
直接改变它的颜色而不是为他多准备另一张点击效果的图片

PorterDuffColorFilter
PorterDuffColorFilter(int color, PorterDuff.Mode mode)
个构造方法也接受两个值,一个是16进制表示的颜色值这个很好理解,而另一个是PorterDuff内部类Mode中的一个常量值,这个值表示混合模式。那么什么是混合模式呢?混合混合必定是有两种东西混才行,第一种就是我们设置的color值而第二种当然就是我们画布上的元素了

设置图形混合模式setXfermode(Xfermode xfermode)

最常用的子类是:PorterDuffXfermode

setMaskFilter(MaskFilter maskfilter)

MaskFilter类中没有任何实现方法,而它有两个子类BlurMaskFilter和EmbossMaskFilter,前者为模糊遮罩滤镜(比起称之为过滤器哥更喜欢称之为滤镜),而后者为浮雕遮罩滤镜,

setShadowLayer(float radius, float dx, float dy, int shadowColor)

该方法为我们绘制的图形添加一个阴影层效果

setPathEffect(PathEffect effect)

设置路径的样式

在做自定义控件的时候canvas.drawText(x,y)
x 的值分两种:
当你的 Paint 设置为myPaint.setTextAlign(Paint.Align.LEFT);,x 就是文字最左侧到当前 view 左边距的距离
当你的 Paint 设置为myPaint.setTextAlign(Paint.Align.CENTER);
x 就是文字中央到当前 view 左边距的距离。

这个y并不是text的左上角,而是以baseline为基准的,y是基线到当前 view 顶部的距离。

FontMetrics fontMetrics = mPaint.getFontMetrics();
        fontMetrics.top;
        fontMetrics.ascent;
        fontMetrics.descent;
        fontMetrics.bottom;

所有的四个值都是以基线baseLine为基准来计算的。baseline以上的就是负的;以下的是正的。
指定中间位置,绘制文本
float baselineY = centerY + (fontMetrics.bottom-fontMetrics.top)/2 - fontMetrics.bottom
指定左上角的顶点坐标 绘制文本
float baselineY = Y - fontMetrics.top;

ComposeShader组合渲染

BitmapShader

BitmapShader (Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
第一个参数是位图这个很显然,而后两个参数则分别表示XY方向上的着色模式,注意BitmapShader是先应用了Y轴的模式而X轴是后应用的!
BitmapShader是从画布的左上方开始着色,在Shader类中有一对setter和getter方法:setLocalMatrix(Matrix localM)和getLocalMatrix(Matrix localM)我们可以利用它们来设置或获取Shader的变换矩阵

LinearGradient

LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
  linearGradient = new LinearGradient(-GradientSize, 0, 0, 0, new int[]{0x22ffffff,0xffffffff,0x22ffffff}, new float[]{0,0.5f,1}, TileMode.CLAMP);//边缘融合
        paint.setShader(linearGradient);
 matrix = new Matrix();
 linearGradient.setLocalMatrix(matrix);

SweepGradient

SweepGradient(float cx, float cy, int color0, int color1)
SweepGradient(float cx, float cy, int[] colors, float[] positions)

RadialGradient

径向渐变,径向渐变说的简单点就是个圆形中心向四周渐变的效果
RadialGradient (float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)
RadialGradient (float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)

ComposeShader