自定义View之Paint和Canvas常用方法一览

自定义View之Paint和Canvas常用方法一览

最近在自定义控件的时候,发现很多方法记的懵懵懂懂,如果不经常写就会忘了。没办法只得复习了一遍大神文章:GcsSloopHenCoder,并整理出笔记以防万一。

Paint常用操作速查表

操作类型相关api备注
抗锯齿setAntiAlias (boolean aa) constructor (Paint.ANTI_ALIAS_FLAG)开启抗锯齿,Paint构造方法开启抗锯齿
填充风格setStyle (Style style)填充风格:FILLSTROKEFILL_AND_STROKE
线条形状setStrokeWidth (float width) setStrokeCap (Cap cap) setStrokeJoin (Join join) setStrokeMiter (float miter)设置线条宽度,设置线头形状,设置拐角形状,设置MITER型拐角延长线最大值
初始化reset () set (Paint src) setFlage (int flags)重置Paint属性,复制Paint所有属性,批量设置flags。
设置着色setColor (int color) setARGB (int a,int r,int g,int b) setShader (Shader shader) setColorFilter (ColorFilter colorFilter) setXfermode (Xfermode xfermode)设置颜色 设置着色器(Shader) 设置颜色过滤 设置颜色处理方案
色彩优化setDither (boolean dither) setFilterBitmap (boolean filter)设置抖动来优化色彩深度降低时的绘制效果,设置双线性过滤来优化 Bitmap 放大绘制的效果
图形轮廓setPathEffect (PathEffect effect)给图形的轮廓设置效果: 单一效果:CornerPathEffectDiscretePathEffectDashPathEffectPathDashPatheffect 组合效果:SumPathEffectComposePathEffecct
绘制附加效果setShadowLayer(float radius,float dx,float dy,int shadowColor) setMaskFilter (MaskFilter maskfilter)setShadowLayer在之后的绘制内容下加一层阴影。setMaskFilter设置绘制层上方的附加效果。MaskFilter有两种:BlurMaskFilter(模糊)和EmbossMaskFilter(浮雕)
文字相关drawText () Paint 超过一半的方法都是 drawText() 相关的
获取绘制的PathgetFillPath (Path src,Path dst) 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)根据 paint 的设置,计算出绘制 Path 或文字时的实际 Path

Canvas常用方法速查表

操作类型相关api备注
绘制颜色drawColor (int color) drawColor (int color, PorterDuff.Mode mode) drawRGB (int r,int g,int b) drawARGB (int a,int r,int g,int b)使用单一颜色填充画布
绘制形状点:drawPoint (float x,float y,Paint paint) drawPoints (float[] pts,Paint paint) drawPoints (float[] pts,int offset,int count,Paint paint) offset:跳过数组的前几个数,count:点的数量线: drawLine (float startX,float startY,float stopX,float stopY,Paint paint) drawLines (float[] pts,Paint paint) drawLines (float[] pts,int offset,int count,Paint paint)矩形: drawRect (Rect rect,Paint paint) drawRect (RectF rect,Paint paint) drawRect (float left,float top,float right,float bottom,Paint paint)圆角矩形:drawRoundRect (RectF rect,float ex,float ry,Paint paint) drawRoundRect (float left, float top, float right, float bottom, float rx, float ry,Paint paint)椭圆: drawOval (RectF oval,Paint paint) drawOval (float left,float top,float right,float bottom,Paint paint)圆: drawCircle (float cx, float cy, float radius,Paint paint)弧: drawArc (RectF oval,float startAngle,float sweepAngle,boolean useCenter,Paint paint) drawArc (float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter,Paint paint)绘制基本图形
绘制图片drawBitmap (Bitmap bitmap,float left,float top,Paint paint) drawBitmap (Bitmap bitmap,Rect src,RectF dst,Paint paint) drawBitmap (Bitmap bitmap,Rect src,Rect dst,Paint paint) drawBitmap (Bitmap bitmap, Matrix matrix,Paint paint) drawPicture (Picture picture)
drawPicture (Picture picture,RectF dst) drawPicture (Picture picture,Rect dst)
绘制位图和图片
绘制文本drawText (char[] text,int index,int count,float x,float y,Paint paint)drawText (String text,float x,floaty,Paint paint)drawText (String text,int star,int end,float x,float y,Paint paint) drawText (CharSequence text,int start,int end,float x,float y,Paint paint) drawTextOnPath (char[] text,int index,int count,Path path,float hOffset,float vOffset,Paint paint) drawTextOnPath (String text,Path path,float hOffset,float vOffset,Paint paint) drawPosText ( … )绘制文字,根据路径绘制文字,绘制文字时指定定每个文字的位置(已弃用)
绘制路径drawPath (Path path,Paint paint)绘制路径,绘制贝塞尔曲线时也需要用到该函数
顶点操作drawVertices (VertexMode mode,int vertexCount,float[] verts,int vertOffset,float[] texs, int texOffset,int[] colors,int colorOffset,short[] indices, int indexOffset, int indexCount,Paint paint) drawBitmapMesh (Bitmap bitmap,int meshWidth,int meshHeight,float[] verts,int vertOffset,Paint paint)通过对顶点操作可以使图像形变, drawVertices直接对画布作用,drawBitmapMesh只作用于绘制的Bitmap
画布剪裁clipPath (Path path) clipRect (Rect rect) clipRect (RectF rect) clipRect (int left, int top, int right, int bottom) clipRect (float left, float top, float right, float bottom) 设置画布的显示区域
画布快照save () restore () saveLayerXXX () restoreToCount (int saveCount) getSaveCount ()保存当前状态,会滚到上一次保存状态,保存图层状态,会滚到指定状态,获取保存次数
画布变换translate (float dx, float dy) scale (float sx, float sy) scale (float sx, float sy, float px, float py) rotate (float degrees) rotate (float degrees, float px, float py) skew (float sx, float sy)位移、缩放、 旋转、错切
Matrix(矩阵)getMatrix () setMatrix (Matrix matrix) concat (Matrix matrix)实际上画布的位移,缩放等操作都是图像矩阵Matrix,只不过Matrix难以理解和使用,故封装了一些常用方法

Paint 画笔🖌️

线条形状

设置线头形状 : setStrokeCap()

Cap为枚举类型,分别是:BUFF平头,ROUND圆头,SQUARE方头,默认为BUFF

设置拐角形状 : setStrokeJoin()

Join为枚举类型,有三个值可以选择:MITER尖角,BEVEL平角,ROUND圆角,默认为MITER

设置尖角补充延长线最大值 : setStrokeMiter()

是对于setStrokeJoin()方法的补充。MITER 型连接点有一个额外的规则:当尖角过长时,自动改用 BEVEL 的方式来渲染连接点。至于多尖算尖角,由setStrokeMiter()miter参数决定。

尖角的外缘端点和内部拐角的距离与线条宽度的比。

setShader() :Shader

Shader主要使用其几个子类:LinearGradientRadialGradientSweepGradientBitmapShaderComposeShader

setColorFilter() :ColorFilter

ColorFilter不直接使用,而是使用它的三个子类:LightingColorFilterPorterDuffColorFilterColorMatrixColorFilter

setXfermode() :Xfermode

色彩优化

设置图像的抖动 : setDither()

实际场景中,抖动更多的作用是在图像降低色彩深度绘制时,避免出现大片的色带与色块。

是否使用双线性过滤绘制 Bitmap : setFilterBitmap()

Android默认使用最近邻插哦旅算法绘制放大图像,这种算法简单,但会出现马赛克效果。setFilterBitmao()可以让图像在放大绘制时,显得更加平滑。

为图形的轮廓设置效果:setPathEffect(PathEffect effect)

PathEffect为图形轮廓设置效果,对Canvas所有图形都有效。Android
中有6种PathEffect,分为两类,

  • 单一效果:CornerPathEffect DiscretePathEffect DashPathEffect PathDashPathEffect
  • 组合效果:SumPathEffect ComposePathEffect
1. 单一效果的:CornerPathEffect

把所有拐角变圆润。

构造方法:CornerPathEffect ( float radius )
raduis:圆角半径。

PathEffect pathEffect = new CornerPathEffect(20);
paint.setPathEffect(pathEffect);
...
canvas.drawPath(path,paint);

效果:

2. 单一效果的:DiscretePathEffect

把线条进行随机偏离(离散),偏离程度由参数决定。

构造方法:DiscretePathEffect ( float segmentLength,float deviation )
segmentLength:用来拼接每个线段的长度。
deviation:偏离量。

PathEffect pathEffect = new DiscretePathEffect(20,5);
...

效果:

3. 单一效果的:DashPathEffect

使用虚线绘制线条。

构造方法:DashPathEffect ( float intervals[], float phase )
intervals[]:指定虚线的格式,元素必须为偶数(最少2个),按照「画线长度,空白长度,画线长度,空白长度…」顺序绘制。
phase:虚线的偏移量。

PathEffect pathEffect = new DashPathEffect(new float[]{20,10,5,10},0);
...

效果:

4. 单一效果的:PathDashPathEffect

使用一个Path来绘制「虚线」。

构造方法:PathDashPathEffect(Path shape, float advance, float phase, Style style)
shape:绘制的Path。
advice:两个相邻shape之间的距离。
phase:虚线的偏移。
style:指定拐角处shape的转换方式。

style有三个枚举值:

  • TRANSLATE:位移
  • ROTATE:旋转
  • MORPH:变体
Path dashPath = ...;
PathEffect pathEffect = new PathDashPathEffect(dashPath,40,0,PathDashPathEffectStyle.TRANSLATE);
...

效果:

5. 混合效果的:SumPathEffect

按照两种PathEffect分别对目标进行绘制。

构造方法:SumPathEffect ( PathEffect first, PathEffect second )

PathEffect dashEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discreteEffect = new DiscretePathEffect(20, 5); 
pathEffect = new SumPathEffect(dashEffect, discreteEffect);...

效果:

6. 混合效果的:ComposePathEffect

先对目标Path使用一个PathEffect,然后对这个改变后的Path使用另一个PathEffect

构造方法:ComposePathEffect ( PathEffect outerpe, PathEffect innerpe )

PathEffect dashEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discreteEffect = new DiscretePathEffect(20, 5); 
pathEffect = new ComposePathEffect(dashEffect, discreteEffect);

效果:

注意PathEffect 在有些情况下不支持硬件加速,需要关闭硬件加速才能正常使用:

  1. Canvas.drawLine() 和 Canvas.drawLines() 方法画直线时,setPathEffect() 是不支持硬件加速的;
  1. PathDashPathEffect 对硬件加速的支持也有问题,所以当使用 PathDashPathEffect 的时候,最好也把硬件加速关了。

Canvas 画布 📄

canvas可以称之为画布,是安卓平台2D图形绘制的基础,可以在上面绘制各种东西。

圆角矩形:drawRoundkRect()

圆角矩形的绘制有两个重载方法:

// 第一种
RectF rectF = new RectF(100,100,800,400);
canvas.drawRoundRect(rectF,30,30,mPaint);

// 第二种 API21的时候才添加上(AndroidX貌似没有这个限制)
canvas.drawRoundRect(100,100,800,400,30,30,mPaint);

与矩形相比,圆角矩形多出来了两个参数rxry,分别表示椭圆的两个半径。

rx大于矩形宽度的一半,ry大于矩形高度的一半时,就变成椭圆了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值