Android Path, Region, Paint, Canvas API篇

从这篇文章开始,准备学习Android Canvas相关的一些知识点,因为Canvas使用的时候还经常要用到Path,Region,Paint。所以这里我们先熟悉Path,Region,Paint,Canvas常用的一些API,为后续的学习做好准备。

在列出Path,Region,Paint,Canvas这些API之前先展示一个具体的实例。一个仪表盘。主要用到的是Canvas的API,和一些三角函数的运算。具体效果图如下

仪表盘分成了三段(2:1:2),每一段显示不同的颜色。刻度分成8大份每小份里面五等分。当然这个仪表盘算一个半成品还有很多待完善的地方。仪表盘代码下载地址

接下来就是具体的API介绍了,同时也为以后找函数的时候方便点(估计有些地方API的解释会有些出入,以后发现了会改正的)

一. Path

对于Path类Android官方文档的解释是,Path类指的是由直线或者二次曲线或者三次曲线组成的几何路径。他可以通过canvas.drawPath(path, paint)去画出这个几何路径,或者这个几何路径的轮廓(这个要取决对应Paint类的Style),同时还可以用于裁剪或者在Paht路径上面绘制文字。

1. Path内部类

1). Path.Direction:用来指定Path的闭合方向。有下面两个值。

CCW:表示逆时针

CW:表示顺时针

作用举例,比如我们要在Path上面画文字,文字的摆放顺序就和Path的闭合方向有关系了。

2). Path.FillType:Path的填充模式。有下面四个值。

WINDING:两个Path所在区域。(Path里面Path.FillType的默认值)

EVEN_ODD:两个Path所在并且不相交的区域。

INVERSE_WINDING:两个Path所有未占区域。

INVERSE_EVEN_ODD :两个Path未占区域 + 两个Path相交区域。

备注:这里未占区域只得是两个Path组成矩形边界区域减掉两个Path占领的区域。

下面通过代码来验证这四种类型的分别去的取的是哪些区域。第一个Path是一个矩形,第二个Path是一个圆形。具体效果图如下,从上带下从左到右依次是WINDING, EVEN_ODD, INVERSE_WINDING, INVERSE_EVEN_ODD 。

3). Path.Op:两个Path结合的逻辑操作。

DIFFERENCE:在第一个Path的基础上减去两个Path重合的部分。

INTERSECT:交集 两个Path重合的部分。

UNION:并集 两个Path的整个区域。

XOR:异或,两个Path没有重合的部分。

REVERSE_DIFFERENCE:在第二个Path的基础上减去两个Path重合的部分。

下面同样通过代码来验证这五种OP的情况,第一个Path是一个矩形,第二个Path是一个圆形。具体效果图如下所示,从上到下从左到右依次是原图,DIFFERENCE, INTERSECT, UNION, XOR, REVERSE_DIFFERENCE。

2. Path类API

addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle)
addArc(RectF oval, float startAngle, float sweepAngle)

在Path中添加圆弧路径,返回值为Void。(发现这个是不用指定路径的闭合方向的)

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)
arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo)
arcTo(RectF oval, float startAngle, float sweepAngle)

将一段圆弧路径连接到Path当中,如果forceMoveTo为false的时候如果当前Path的最后一个点和圆弧的第一个点不一样,那么就会先通过lineTo()将这两个点连接起来。当然如果Path是空的,那就会调用moveTo()把Path的第一个点移到圆弧的第一个点上来。forceMoveTo为true的时候不会连接,和addArc是一样的效果。

addCircle(float x, float y, float radius, Path.Direction dir)

在Path中添加圆形路径。

addOval(RectF oval, Path.Direction dir)
addOval(float left, float top, float right, float bottom, Path.Direction dir)

在Path中添加椭圆路径。

addPath(Path src, Matrix matrix)
addPath(Path src)
addPath(Path src, float dx, float dy)

在Path中添加另一个Path路径,第一个是添加src经过matrix变换之后的Path,第三个是添加src在x,y轴上面分别偏移dx,dy的Path。

备注:Matrix:矩阵工具类,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。

addRect(RectF rect, Path.Direction dir)
addRect(float left, float top, float right, float bottom, Path.Direction dir)

在Path中添加矩形路径。

addRoundRect(RectF rect, float rx, float ry, Path.Direction dir)
addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Path.Direction dir)
addRoundRect(RectF rect, float[] radii, Path.Direction dir)
addRoundRect(float left, float top, float right, float bottom, float[] radii, Path.Direction dir)

在Path中添加圆角矩形路径。第一个第二个函数里面rx,ry指的是各个角的半径点。第三第四个函数里面raddii参数是长度为8的数组正好对应四个角的半径点(依次是左上角,右上角,右下角,左下角)。

备注:对于圆角我是这么理解的,给定了对应角的x,y。用x,y在这个角去顶一个矩形,然后依据这个矩形去画椭圆确定圆角。

computeBounds(RectF bounds, boolean exact)

得到Path的矩形边界,并且将结果写入参数bounds中,如果Path中只有0或者1个点,那么bounds会返回(0,0,0,0)的值。exact这个变量没用已经抛弃了不管他。

close()

当Paint的Style设置为Paint.Style.STROKE,并且Path使用moveTo(),lineTo()。当调用close()之后会把第一个点和最后一个点连接起来形成闭合的Path。这里当Paint的Style设置为Paint.Style.FILL的时候close()没什么特别的效果。

cubicTo(float x1, float y1, float x2, float y2, float x3, float y3)

从最后一个点开始增加一段贝塞尔曲线到Path当中,接近(x1,y1),(x2,y2),同时在(x3,y3)中结束,如果这个Path没有调用过moveTo(),那么将会以(0,0)作为起点。

setFillType(Path.FillType ft)
getFillType()

两个相对应的函数,设置和获取Path.FillType。对于Path.FillType的作用文章开始的地方有提到过。

incReserve(int extraPtCount)

提示Path将会增加extraPtCount个点,这能使Path有效率的分配它的存储.

isEmpty()

判断Path是否是空的,没有添加过任何Path。

isInverseFillType()

是否是 逆 填充模式:WINDING和EVEN_ODD返回false,INVERSE_WINDING和INVERSE_EVEN_ODD 返回true。

isRect(RectF rect)

如果Path指定了一个矩形,那么返回true,并且rect将会存储Path的边界值,如果没有指定一个矩形,返回false,并且忽略掉rect。

lineTo(float x, float y)

将Path的最后一个点连接点(x,y),如果Path还没调用moveTo的话,将(0,0)点连接到(x,y)。

moveTo(float x, float y)

设置下一个Path的第一个点。

offset(float dx, float dy, Path dst)
offset(float dx, float dy)

将Path平移dx,dy,第一个函数同时会将结果写到dst中。

op(Path path1, Path path2, Path.Op op)
op(Path path, Path.Op op)

两个Path按照op的方式结合,第一个函数path1和path2结合结果放在当前Path中,第二个函数当前Path和path组合结果放在当前Path中。

quadTo(float x1, float y1, float x2, float y2)

增加一条二次的贝塞尔曲线到Path的最后一个点,接近(x1,y1),在(x2,y2)点结束。如果Path没有调用moveTo来确定第一个点,那第一个点设置为(0,0)。

rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3)
rLineTo(float dx, float dy)
rMoveTo(float dx, float dy)
rQuadTo(float dx1, float dy1, float dx2, float dy2)

类比cubicTo,lineTo,moveTo,quadTo函数,参数是相对于第一个点的偏移量。用rCubicTo来举例子说明:path.moveTo(200, 500);path.cubicTo(200, 500, 200, 600, 100, 650);那么换成rCubicTo就应该是这样的path.rCubicTo(0, 0, 0, 100, -100, 150);偏移量都是以path.moveTo(200, 500)中的(200, 500)为基准点。

reset()

清空Path的任何直线和曲线,让它变成空,但是不会改变filltype。

rewind()

清空Path的任何直线和曲线,但是保留它内部的数据结构,以便更好的重新使用。

set(Path src)

用src的值替代当前Path的值。

setLastPoint(float dx, float dy)

设置当前Path最后一个点。

toggleInverseFillType()

切换相反的FillType模式。

transform(Matrix matrix, Path dst)
transform(Matrix matrix)

将Path进行matrix变化,第一个函数同时会将结果给dst。

二. Region

Region用来表示Canvas图层上的某个封闭的区域。

1. Region内部类

Region.Op:两个Region组合的方式,有下面6中方式,每种方式对应不同的结果:

DIFFERENCE:在第一个Region的基础上减掉和第二个Region重合的区域。

INTERSECT:两个Region交集部分。

UNION:全集 两个Region的全集。

XOR:补集,全集减去交集。

REVERSE_DIFFERENCE:第二个Region的基础上减掉和第一个Region重合的部分。

REPLACE: 第二个Region区域。

2. Region API

Region()
Region(Region region)
Region(Rect r)
Region(int left, int top, int right, int bottom)

四个构造函数,这个好说。

contains(int x, int y)

当前Region是否包含指定的点(x,y)。

getBoundaryPath(Path path)
getBoundaryPath()

获取Region的Path边界区域。第一个函数获取到的Path边界区域放在path中,第二个函数直接返回Path边界区域。

getBounds(Rect r)
getBounds()

获取Region的矩形边界区域。第一个函数获取到的矩形边界区域放在r中,第二个函数直接返回矩形边界区域。(用Rect去框Region)

isComplex()

Region是否包含多个矩形。

isEmpty()

Region是否为空。

isRect()

Region是否是一个矩形。

op(Region region1, Region region2, Region.Op op)
op(Rect r, Region.Op op)
op(Rect rect, Region region, Region.Op op)
op(Region region, Region.Op op)
op(int left, int top, int right, int bottom, Region.Op op)

设置Region为两个Region进行Op的结果。(注意如果参数里面只是指定了一个Region那么就是和当前的Region Op)。

quickContains(Rect r)
quickContains(int left, int top, int right, int bottom)

Region是否是一个矩形,并且包含r。(只能是一个矩形,单数)。

quickReject(Region rgn)
quickReject(Rect r)
quickReject(int left, int top, int right, int bottom)

Region是否是空或者和参数里面的区域不相交。(如果Region是空返回值也是true)

set(int left, int top, int right, int bottom)
set(Region region)
set(Rect r)
setEmpty()
setPath(Path path, Region clip)

设置Region,最后一个函数取的是共同的区域。

translate(int dx, int dy, Region dst)
translate(int dx, int dy)

Region做dx,dy的平移变换,第一个函数同时把结果放在dst中。

union(Rect r)

Region和r合并。(取两者的交集)

三. Paint

1. Paint内部类

1). Paint.Align::用于表示字符的位置,有下面三个值,比如字符以坐标(x,y)为源点。

CENTER:表示字符在水平方向上以x中心向左右两边延伸,在垂直方向以y为起点向下延伸。

LEFT:表示字符在水平方向上以x为起点向右延伸,在垂直方向上以y为起点向下延伸。

RIGHT:表示字符在水平方向上以x为起点向左延伸,在垂直方向上以y为起点向下延伸。

2). Paint.Cap:画笔结束时的样式,用来控制我们的画笔在离开画板时候留下的最后一点图形。有下面三个值:

BUTT:默认值,画笔正常结束不做处理。

ROUND:画笔结束的时候会多一个半圆(直径是画笔的粗细)。

SQUARE:画笔结束的时候对一个正方形(长宽是画笔的粗细)。

3). Paint.FontMetrics:字体属性(里面的各个属性都是float)

4). Paint.FontMetricsInt:字体属性(里面的各个属性都是int)

5). Paint.Join:两个图形接触是的样式,用来控制画的图形接触时候的样式。有下面三个值:

BEVEL:默认值,连接的边缘是一条直线。

MITER:连接的边缘是一个尖角。

ROUND:连接的边缘是一段圆弧。

6). Paint.Style:画笔的样式。有下面三个值。

FILL:填充。

FILL_AND_STROKE:描边+填充。

STROKE:描边。

2. Paint API

Paint()
Paint(int flags)
Paint(Paint paint)

三个构造函数,第二个函数里面的flags只是个标记用的。

ascent()

基准线baseline至字符最高处的距离一般是一个负数。

descent()

基准线baseline至字符最低处的距离一般是一个正数。

breakText(char[] text, int index, int count, float maxWidth, float[] measuredWidth)
breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)
breakText(CharSequence text, int start, int end, boolean measureForwards, float maxWidth, float[] measuredWidth)

置一个最大宽度,在不超过这个宽度的范围内返回实际测量的字符的个数否则停止测量。maxWidth表示一个给定的最大宽度在这个宽度内能测量出几个字符,measuredWidth为一个可选项,可以为空,不为空时返回真实的测量值。measureForwards表示向前还是向后测量。

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

用于给背景加或者清除阴影效果,这个方法不支持硬件加速(调用函数setLayerType(LAYER_TYPE_SOFTWARE, null);关掉硬件加速)。

getShader()
setShader(Shader shader)

用于设置和获取着色方案,绘制各种渐变效果。

getAlpha()
setAlpha(int a)

用于设置和获取画笔的透明度。

getColor()
setColor(int color)
setARGB(int a, int r, int g, int b)

设置或者获取Paint的颜色。

getColorFilter()
setColorFilter(ColorFilter filter)

设置或者获取颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例。

getFillPath(Path src, Path dst)

我试了下这个函数,好像就是把src的内容给了dst。

getFlags()
setFlags(int flags)

设置或者获取Paint的标记。

getFontFeatureSettings()
setFontFeatureSettings(String settings)

设置和获取字体的特性(css font-feature-settings)。

getHinting()
setHinting(int mode)

设置和获取画笔的隐藏模式。可以是HINTING_OFF or HINTING_ON之一。

getLetterSpacing()
setLetterSpacing(float letterSpacing)

设置和获取行间距,默认是0。

getMaskFilter()
setMaskFilter(MaskFilter maskfilter)

设置和获取Paint的MaskFilter,MaskFilter可以用于创建模糊阴影以及浮雕效果。(BlurMaskFilter 指定了一个模糊的样式和半径来处理Paint的边缘,EmbossMaskFilter 指定了光源的方向和环境光强度来添加浮雕效果)

getOffsetForAdvance(char[] text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance)
getOffsetForAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance)

返回某个字符最靠近水平方向的序号。

getPathEffect()
setPathEffect(PathEffect effect)

设置和获取绘制路径的效果。(PathEffect 本身并没有做什么特殊的处理,只是继承了Object,通常我们使用的是它的几个子类,如CornerPathEffect将Path的各个连接线段之间的夹角用一种更平滑的方式连接,DashPathEffect会将Path的线段虚线化等等)

getRasterizer()
setRasterizer(Rasterizer rasterizer)

设置获取光栅,这两个函数高版本已经被放弃掉了。

getRunAdvance(char[] text, int start, int end, int contextStart, int contextEnd, boolean isRtl, int offset)
getRunAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, int offset)

还没弄明白这两个函数是干嘛用的,等后面找到了在加上。

getStrokeCap()
setStrokeCap(Paint.Cap cap)

设置和获取Paint的Paint.Cap。(Paint.Cap上面有介绍哦)

getStrokeJoin()
setStrokeJoin(Paint.Join join)

设置和获取Paint的Paint.Join。(Paint.Join上面有介绍哦)

getStrokeMiter()
setStrokeMiter(float miter)

设置笔画的倾斜度,取值>=0。如小时候用的铅笔,削的时候斜与垂直削出来的笔尖效果是不一样的。主要是用来设置笔触的连接处的样式。可以和setStrokeJoin()来比较比较。

getStrokeWidth()
setStrokeWidth(float width)

当Paint样式为STROKE或FILL_OR_STROKE时,设置和获取笔刷的粗细度。

getStyle()
setStyle(Paint.Style style)

设置和获取Paint的样式Paint.Style。(Paint.Style前面有介绍哦)

getTextAlign()
setTextAlign(Paint.Align align)

设置和获取文本的对齐方式Paint.Align。(Paint.Align前面有介绍哦)

getTextBounds(String text, int start, int end, Rect bounds)
getTextBounds(char[] text, int index, int count, Rect bounds)

获取字符的宽度和高度。

getTextLocale()
setTextLocale(Locale locale)

设置和获取地理位置,这里如果你要使用,直接传入Locale.getDefault()即可。它用来设置文本的区域比如中文、日文等。

getTextPath(char[] text, int index, int count, float x, float y, Path path)
getTextPath(String text, int start, int end, float x, float y, Path path)

获取指定文本的路径。

getTextScaleX()
setTextScaleX(float scaleX)

设置和获取文本沿X轴水平缩放值。

getTextSize()
setTextSize(float textSize)

设置和获取字体大小。

getTextSkewX()
setTextSkewX(float skewX)

设置和获取文本在水平方向上的倾斜。这个倾斜值没有具体的范围,但是官方推崇的值为-0.25可以得到比较好的倾斜文本效果,值为负右倾值为正左倾,默认值为0。

getTextWidths(char[] text, int index, int count, float[] widths)
getTextWidths(String text, float[] widths)
getTextWidths(String text, int start, int end, float[] widths)
getTextWidths(CharSequence text, int start, int end, float[] widths)

精确获取文字宽度,返回值是获取到的文字的宽度,widths参数是一个数组里面会返回每个测量的字符的宽度,所以这个数组的长度要大于字符的个数。

getTypeface()
setTypeface(Typeface typeface)

设置和获取文本字体样式。

getXfermode()
setXfermode(Xfermode xfermode)

设置和获取图像的混合模式Xfermode。(Xfermode 应该是有16中组合方式)

hasGlyph(String string)

确定Paint设置的Typeface是否支持该字符串。

isAntiAlias()
setAntiAlias(boolean aa)

设置和获取是否使用抗锯齿功能。

isDither()
setDither(boolean dither)

设置和获取是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰。

isElegantTextHeight()
setElegantTextHeight(boolean elegant)

优雅的文字高度,特别是对于不那么复杂的文字文字。

isFakeBoldText()
setFakeBoldText(boolean fakeBoldText)

设置文本仿粗体。注意设置在小字体上效果会非常差。

isFilterBitmap()
setFilterBitmap(boolean filter)

如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置。

isLinearText()
setLinearText(boolean linearText)

设置是否打开线性文本标识。

isStrikeThruText()
setStrikeThruText(boolean strikeThruText)

设置文本删除线。

isSubpixelText()
setSubpixelText(boolean subpixelText)

设置自像素。如果该项为true,将有助于文本在LCD屏幕上的显示效果。

isUnderlineText()
setUnderlineText(boolean underlineText)

设置文字的下划线。

measureText(char[] text, int index, int count)
measureText(CharSequence text, int start, int end)
measureText(String text, int start, int end)
measureText(String text)

初步计算文字宽度。

reset()

恢复Paint初始设置。

四. Canvas

Canvas代表依附于指定View的画布,可以在这块画布上面绘制各种图片。

1. Canvas 内部类

1). Canvas.EdgeType:

2). Canvas.VertexMode:

2. Canvas API

Canvas()
Canvas(Bitmap bitmap)

两个构造函数,第一个是创建一个空的画布,第二个是以bitmap对象创建一个画布,则将内容都绘制在bitmap上(bitmap不能为空)。

clipPath(Path path, Region.Op op)
clipPath(Path path)

用指定的path按照op规则去切当前Canvas,如果没有指定op,则就是默认值Region.Op.INTERSECT。

clipRect(float left, float top, float right, float bottom, Region.Op op)
clipRect(RectF rect)
clipRect(Rect rect, Region.Op op)
clipRect(int left, int top, int right, int bottom)
clipRect(float left, float top, float right, float bottom)
clipRect(RectF rect, Region.Op op)
clipRect(Rect rect)

用矩形去切当前的Canvas。

clipRegion(Region region)
clipRegion(Region region, Region.Op op)

用指定的区域region去切当前Canvas。

concat(Matrix matrix)

对当前Canvas做matrix的变换。

drawARGB(int a, int r, int g, int b)

用指定的ARGB去设置Canvas的颜色。

drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

画圆弧。

drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)
绘制bitmapma通过trix变换之后的位图。
drawBitmap(int[] colors, int offset, int stride, float x, float y, int width, int height, boolean hasAlpha, Paint paint)
用指定的颜色数组colors去绘制位图,offset表示colors的起始位置,stride表示颜色数组的行数,x,y绘制的坐标点,width位图的宽,height位图的高,hasAlpha表示colors中的每个点是否包含alpha值。
drawBitmap(int[] colors, int offset, int stride, int x, int y, int width, int height, boolean hasAlpha, Paint paint)
drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)
绘制位图src表示对bitmap进行裁剪 dst则表示在canvas上面显示的区域,如果dst小于src那么对src裁剪区域缩小,反之放大。
drawBitmap(Bitmap bitmap, float left, float top, Paint paint)
在指定点绘制bitmap位图
drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)

绘制位图。

drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)

绘制扭曲位图。(bitmap:需要扭曲的源位图,meshWidth:控制在横向上把该源位图划成成多少格,meshHeight:控制在纵向上把该源位图划成成多少格 ,verts:长度为(meshWidth + 1) * (meshHeight + 1) * 2的数组,它记录了扭曲后的位图各顶点位置,vertOffset:控制verts数组中从第几个数组元素开始才对bitmap进行扭曲,colors:指定每个顶点的颜色,colorOffset:顶点的颜色从哪个位置开始)

drawCircle(float cx, float cy, float radius, Paint paint)

绘制圆形。

drawColor(int color)
drawColor(int color, PorterDuff.Mode mode)
drawRGB(int r, int g, int b)

设置Canvas的颜色。(当Canvas之前的颜色和要设置的颜色不同的时候由于PorterDuff.Mode的不同,表现的形式也不一样)

drawLine(float startX, float startY, float stopX, float stopY, Paint paint)

绘制直线。

drawLines(float[] pts, int offset, int count, Paint paint)
drawLines(float[] pts, Paint paint)

绘制多条直线。(pts:没四个元素组成一条直线)

drawOval(float left, float top, float right, float bottom, Paint paint)
drawOval(RectF oval, Paint paint)

绘制椭圆。

drawPaint(Paint paint)

这个函数相当于把当前的Canvas的边界看着是Path。然后基于这个Path去绘制,比如当paint参数Style设置填充的时候会绘制整个Canvas的颜色,当paint参数的Style设置为描边的时候只会绘制Canvas的边界。

drawPath(Path path, Paint paint)

绘制路径。

drawPicture(Picture picture, Rect dst)
drawPicture(Picture picture, RectF dst)
drawPicture(Picture picture)

绘制图片,dst表示要绘制的区域。

drawPoint(float x, float y, Paint paint)

绘制点。

drawPoints(float[] pts, int offset, int count, Paint paint)
drawPoints(float[] pts, Paint paint)

绘制多个点。(pts:没两个元素组成一个点)

drawPosText(String text, float[] pos, Paint paint)
drawPosText(char[] text, int index, int count, float[] pos, Paint paint)

绘制每个字符到指定位置。(pos:每两个元素表示一个字符的位置)

drawRect(float left, float top, float right, float bottom, Paint paint)
drawRect(Rect r, Paint paint)
drawRect(RectF rect, Paint paint)

绘制矩形。

drawRoundRect(RectF rect, float rx, float ry, Paint paint)
drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)

绘制圆角矩形。rx,ry两个参数指的是各个角的半径点。

drawText(CharSequence text, int start, int end, float x, float y, Paint paint)
drawText(String text, float x, float y, Paint paint)
drawText(String text, int start, int end, float x, float y, Paint paint)
drawText(char[] text, int index, int count, float x, float y, Paint paint)

绘制字符。(x,y)表示在哪个点绘制文字,同时在paint里面可以指定Paint.Align控制相对于这个点的位置。

drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)
drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)

在指定的路径path上面绘制文字。这里文字的方向和path的闭合方向(Path.Direction)有关系。

drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount, float x, float y, boolean isRtl, Paint paint)
drawTextRun(CharSequence text, int start, int end, int contextStart, int contextEnd, float x, float y, boolean isRtl, Paint paint)

看介绍好像是绘制滚动的文字,但是我没有试出效果以后找到了在补充。

drawVertices(Canvas.VertexMode mode, int vertexCount, float[] verts, int vertOffset, float[] texs, int texOffset, int[] colors, int colorOffset, short[] indices, int indexOffset, int indexCount, Paint paint)

绘制一系列三角形,通过一系列顶点来指定它们。 mode:顶点的类型比如他是三角形(连续3个顶点)或者 四边形 (连续4个顶点)等等,vertexCount :顶点数总共有多少个顶点绘制,verts[]:顶点数组比如指定了是三角形那么6个元素组成一组。

getClipBounds(Rect bounds)
getClipBounds()

返回当前Canvas的边界矩形,可以用于画边框。(一个是通过出参返回一个是通过return返回)

getDensity()
setDensity(int density)

设置和获取像素密度。

getDrawFilter()
setDrawFilter(DrawFilter filter)

抗锯齿效果当然还可以设置其他的。经常是用DrawFilter的子类PaintFlagsDrawFilter:canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));来设置图片线条(通用)的抗锯齿。

注意:paint.setAntiAlias(true);画笔的抗锯齿(用于线条等)。

getHeight()
getWidth()

获取当前Canvas的高度和宽度。

getMatrix()
getMatrix(Matrix ctm)
setMatrix(Matrix matrix)

设置和获取当前Canvas的Matrix对象。(Matrix:用于一些缩放平移等操作)

getMaximumBitmapHeight()
getMaximumBitmapWidth()

获取当前Canvas允许绘制位图的最大高度和宽度。

getSaveCount()

返回栈中保存的状态,值等译 save()调用次数-restore()调用次数。

isHardwareAccelerated()

是否硬件加速。

isOpaque()

是否是不透明的。

quickReject(float left, float top, float right, float bottom, Canvas.EdgeType type)
quickReject(Path path, Canvas.EdgeType type)
quickReject(RectF rect, Canvas.EdgeType type)

是否和指定区域不重叠。

rotate(float degrees, float px, float py)
rotate(float degrees)

旋转当前Canvas。如果没有指定旋转点则默认是坐标原点。

skew(float sx, float sy)

Canvas错切。sx:将画布在x方向上倾斜相应的角度,sx为倾斜角度的tan值,sy:将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值。

translate(float dx, float dy)

平移Canvas。

scale(float sx, float sy, float px, float py)
scale(float sx, float sy)

缩放当前Canvas。如果没有指定旋转点则默认是坐标原点。

save(int saveFlags)
save()

保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。一般和restore成对出现。

restore()
restoreToCount(int saveCount)

用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。 。第一个函数是回到上一个save调用之前的状态,如果restore调用的次数大于save方法,会出错。第二个函数是返回到任何一个save()方法调用之前的状态。

saveLayer(float left, float top, float right, float bottom, Paint paint)
saveLayer(RectF bounds, Paint paint, int saveFlags)
saveLayer(RectF bounds, Paint paint)
saveLayer(float left, float top, float right, float bottom, Paint paint, int saveFlags)
saveLayerAlpha(float left, float top, float right, float bottom, int alpha, int saveFlags)
saveLayerAlpha(RectF bounds, int alpha, int saveFlags)
saveLayerAlpha(float left, float top, float right, float bottom, int alpha)
saveLayerAlpha(RectF bounds, int alpha)

创建一个新的Layer到“栈”中,然后可以在这个Layer上做一系列的绘制操作。当一系列动作完成之后调用restore,restoreToCount函数Layer出栈,同时会把本层Layer绘制的图像“绘制”到上层或是Canvas上。

setBitmap(Bitmap bitmap)

会把bitmap位图绘制在Canvas上。(bitmap.isMutable() 要返回true)。

时间: 2024-10-02 05:01:59

Android Path, Region, Paint, Canvas API篇的相关文章

Android图像处理(二)--Paint,Canvas,ColorMatrix详细

android开发中可能经常会用到这些东西; 一.介绍 Paint:画笔 Canvas:画布 Matrix:变换矩阵 Paint 根据我们要画的类型,我们可以选择不同的笔,比如大气磅礴的山水画,我们可以选择大头的毛笔:细腻入微的肖像画我们可以选择尖头的铅笔.并且根据我们想要的效果,我们在绘画的时候,还会选择不同的颜料或不同颜色的笔: 那么在程序中,Paint 就足以满足以上所有的需要,我们可以根据我们自己的需要去自行设置我们画笔的属性,首先来看看都能设置哪些属性: Public Construc

Android】 Canvas Path 和 Paint 实例 杏彩出租游戏开发必备

Canvas类主要实现 杏彩出租 <Q> 2952777280[源码链接] hxforum.com  了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径.区域.贴图.画点.画线.渲染文本,下面是Canvas类常用的方法,当然Android开发网提示大家很多方法有不同的重载版本,参数更灵活. void drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域 void drawPath(Path path, Paint paint) 

Android 2D Graphics学习 Region和Canvas裁剪

1.首先介绍Region类 Region,中文意思即区域的意思,它表示的是canvas图层上的某一块封闭的区域. [java] view plaincopyprint? /**构造方法*/ public Region()  //创建一个空的区域 public Region(Region region) //拷贝一个region的范围 public Region(Rect r)  //创建一个矩形的区域 public Region(int left, int top, int right, int

Android基础入门教程——8.3.16 Canvas API详解(Part 1)

Android基础入门教程--8.3.16 Canvas API详解(Part 1) 标签(空格分隔): Android基础入门教程 本节引言: 前面我们花了13小节详细地讲解了Android中Paint类大部分常用的API,本节开始我们来讲解 Canvas(画板)的一些常用API,我们在Android基础入门教程--8.3.1 三个绘图工具类详解 中已经列出了我们可供调用的一些方法,我们分下类: drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前

【Android】21.2 Canvas和Paint

分类:C#.Android.VS2015: 创建日期:2016-03-19 一.Canvas对象简介 画布(Canvas对象)是与System.Drawing或iOS核心图形等传统框架非常类似的另一种图形图像绘制技术,该对象提供了创建2D图形的最大控制,利用它可解决难以处理画板资源的情况.例如,绘制自定义滑块控件的外观等. 可以把Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套绘图API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的

Android基础入门教程——8.3.18 Canvas API详解(Part 3)Matrix和drawBitmapMash

Android基础入门教程--8.3.18 Canvas API详解(Part 3)Matrix和drawBitmapMash 标签(空格分隔): Android基础入门教程 本节引言: 在Canvas的API文档中,我们看到这样一个方法:drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) 这个Matrix可是有大文章的,前面我们在学Paint的API中的ColorFilter中曾讲过ColorMatrix 颜色矩阵,一个4 * 5 的矩阵

自定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 二,图像遮盖,Canvas静态变化)

转载请注明出处:王亟亟的大牛之路 上一篇把简单的一些概念理一理,还画了个圈,那这一篇讲一下图像遮盖"Xfermode"和Canvas的旋转.平移等效果 Xfermode: AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图). PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素异或操作. PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任

Android自定义View和Canvas绘图解析

自定义view的流程分为measure. layout.draw三个主要步骤,今天我们通过源码来分下下measure的过程 我们从顶级view开始,顶级view即DecorView, view的事件都是先经过这个DecorView, 接下来我们来看看这个DecorView的MeasureSpec的创建过程: ViewRoot 对应 ViewRootImpl类,  是连接WindowManager 和 DecorView的纽带,   进入ViewRootImpl中,查看measureHierarc

Android_2D绘图的学习Paint,Canvas(二)

前言 上一节,学会了Paint,Canvas的基本用法后,这一节,学习Paint的高级用法.还没看过上一节的请点击这里:Android_2D绘图的学习Paint,Canvas(一). 一,文字的绘制 在做UI的时候,常常会绘制文字,Canvas绘制文字时,主要考虑到字体的宽度和高度问题.字体的宽度比较好理解,这里我们主要考虑一下字体的高度. 先看一张图,网上搜的: 这里说明了在安卓中绘制字体时对于高度的划分:top,ascent,baseLine,descent,bottom.有点类似我们刚开始