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

image
// 先绘制dis目标图
        canvas.drawBitmap(bitmapDis, x, y, mPaint);

        // 设置混合模式
        mPaint.setXfermode(porterDuffXfermode);

        // 再绘制src源图
        canvas.drawBitmap(bitmapSrc, x, y, mPaint);

        // 还原混合模式
        mPaint.setXfermode(null);

        // 还原画布
        canvas.restoreToCount(sc);

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;

image

Shader

BimapShader位图的图像渲染器
LinearGradient线性渲染
RadialGradient环形渲染
水波纹效果,充电水波纹扩散效果、调色板
SweepGradient梯度渲染(扫描渲染)
微信等雷达扫描效果。手机卫士垃圾扫描
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

组合Shader的意思,顾名思义就是两个Shader组合在一起作为一个新Shader

ComposeShader (Shader shaderA, Shader shaderB, Xfermode mode)
ComposeShader (Shader shaderA, Shader shaderB, PorterDuff.Mode mode)

两个都差不多的,只不过一个指定了只能用PorterDuff的混合模式而另一个只要是Xfermode下的混合模式

链接:https://www.jianshu.com/p/a54b758803c9

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,312评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,578评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,337评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,134评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,161评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,303评论 1 280
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,761评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,421评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,609评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,450评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,504评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,194评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,760评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,836评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,066评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,612评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,178评论 2 341