常用方法
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