-
Color
与颜色处理相关的类。常量颜色
BLACK、BLUE、RED、GRAY、WHITE、YELLOW等等。构造颜色
(1)带透明度的颜色:static int argb(int alpha, int red, int green, int blue){}
分别传入A、R、G、B四个颜色分量,合并成一个颜色,其中四个色彩分量的取值范围均为:0~255。 A:透明度,取值为0时表示完全透明,取值为255时表示完全不透明。 R:红色值,取值为0时表示红色完全不可见,取值为255时表示红色完全显示。 G:绿色值,取值含义同上。 B:蓝色值,取值含义同上。
(2)不带透明度的颜色:
static int rbg(int red, int green, int blue){}
构造同(1),只是不允许指定alpha值,alpha取值255。
提取颜色分量
不仅能通过Color
类合并颜色,还能从一个颜色中提取指定的颜色分量:static int alpha(int color){} static int red(int color){} static int green(int color){} static int blue(int color){}
通过这四个方法提取出对应的A、R、G、B颜色分量。
比如:val green = Color.green(0xFF000F00)
则green的值即为0x0F。
-
路径:Path
Path.Direction参数
(1)Path.Direction.CCW:counter-clockwise的缩写,逆时针方向的路径。
(2)Path.Direction.CW:clockwise的缩写,顺时针方向的路径。
路径方向只作用于根据路径绘制的文字上
在矩形路径上绘制 “苦心人天不负,有志者事竟成”,效果如图:
Path填充模式:
(1) Path.FillType.WINDING:默认值,当两个路径相交时,取相交部分;
(2) Path.FillType.EVEN_ODD:取path所在但并不相交的部分;
(3) Path.FillType.INVERSE_WINDING:取path的外部区域;
(4) Path.FillType.INVERSE_EVEN_ODD:取path的外部和相交区域。区别如图所示:
书中关于Path.FillType该解释与扔物线HenCoder中不一致:https://hencoder.com/ui-1-1/
重置路径
为了重复利用空间,节省内存,将原有Path对象的所有路径清空。void reset() void rewind()
两者的区别:
rewind()函数会清楚FilllType以及所有的直线、点、矩形等数据,但是会保留其数据结构,这样可以快速复用,提升一定的性能。例如,重复绘制一类线段,它们点的数量都相同,那么使用rewind()函数可以保留装载点的数据结构,效率会更高。一定要注意的是,只有在绘制相同的路径时,这些数据结构才可以复用。
reset()函数等同于clear,它的所有数据空间都会被回收并重新分配,但不会清除FillType。
从整体上来说,rewind()函数不会清除内存,会清除FillType;reset()函数会清除内存,不会清除FillType。
-
文字
镂空效果
将Paint.Style设置成STROKE,可以呈现文字镂空效果。Paint().apply { isAntiAlias = true style = Paint.Style.STROKE strokeWidth = 2f textSize = 60f color = ContextCompat.getColor(context, R.color.color_101010) } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) canvas?.drawText("床前明月光", 100f, 100f, paint) }
效果如图:
绘制方向:setTextAlign()函数
public void setTextAlign(Align align){}
参数值为:
Align.LEFT:在绘制点居左绘制;
Align.CENTER:在绘制点居中绘制;
Align.RIGHT:在绘制点居右绘制。同样是绘制文字"床前明月光",效果如图:
字体倾斜度:setTextSkewX()函数
public void setTextSkewX(float skewX)
倾斜是将文字的基线向左或右拉扯,小于0向左倾斜,大于0向右倾斜。
效果如图:
-
Region
一块任意形状的封闭区域。构造Region
(1)直接构造:public Region(Region region){} public Region(Rect r){} public Region(int left, int top, int right, int bottom){}
(2)间接构造:
public Region(){}
间接构造主要通过空参构造函数与set系列函数相结合实现。
public void setEmpty() //置空 public void set(Region region) public void set(Rect r) public void set(int left, int top, int right, int bottom) public void setPath(Path path,Region clip)
无论调用set系列函数的Region是不是有区域值,当调用set系列函数之后,原来的区域值就会被set系列函数中的区域值覆盖。
setPath()函数
path:用来构造区域的路径。
Region:与path参数所构成的路径取交集,并将该交集设置为最终的区域。
当我们需要构造一个path指定的区域时,此时需要传递一个region与path去交集,我们可以传递一个比path大得多的区域,取交集后就是path所对应的区域了。举例:
区域相交
Region不是用来画图的,而是用来做各种区域的相交操作的。
(1) union()函数boolean union(Rect r)
将两个区域取并集。
举例:Region region = new Region(10 ,10, 200, 100); region.union(new Rect(10, 10, 50, 300));
结果如图:
(2) op()函数boolean op(Rect r,Op op) boolean op(int left, int top, int right, int bottom, Op op) boolean op(Region region, Op op)
这些函数的含义为:用当前的Region(调用者)与指定的一个区域执行相交操作,并将结果赋给当前的Region。如果成功返回
true
,失败则返回false
。最重要的是指定操作类型的
Op
参数:
效果如图:
-
Canvas
(1)每次调用drawXXX()系列函数时,都会产生一个全新的canvas的透明图层,绘制内容都在这个透明图层上,绘制结束后再将绘制内容放到View中。
(2)如果在调用drawXXX()系列函数前,调用平移、旋转、裁剪等函数对canvas进行了操作,那么这个操作是不可逆的。每次产生的canvas的最新位置都是在执行这些操作后的位置。(使用save()、restore()除外)
(3)在canvas与屏幕合成时,超出屏幕范围的图像是不会显示出来的。画布是有栈的概念的,和Activity栈一样,通过
save()
压栈,restore()
出栈//保存画布 int save(){} //恢复画布 void restore(){} //恢复到第几层画布 void restoreToCount(int count){}