绘制类:canvas.drawXXX(基本信息,paint控制颜色、风格等) ,draw颜色、点线、图形、路径、图片、文字等
canvas绘制drawPicture
简介:可以看作是一个录制Canvas操作的录像机,将操作录制下来重复调用,开销小。
使用drawBitmap详解
drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) 矩阵变换
Matrix 中的几个常用的变换方法:
setTranslate(float dx, float dy):控制Matrix进行平移;
setRotate(float degrees, float px, float py):旋转,参数依次是:旋转角度,轴心(x,y);
setScale(float sx, float sy, float px, float py):缩放, 参数依次是:X,Y轴上的缩放比例;缩放的轴心;
setSkew(float kx, float ky):倾斜(扭曲),参数依次是:X,Y轴上的缩放比例;
reset():重置
drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
src:指定绘制图片的区域
dst:指定图片在屏幕上显示(绘制)的区域
场景drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)
网格拉伸效果/图像扭曲
参数:meshWidth/meshHeight:在横/纵向上把原位图划分为多少格;
verts:长度为(meshWidth+1)*(meshHeight+1)*2的一维数组,记录扭曲后位图各顶点(网格线交点) 位置,控制扭曲效果;
(假设横纵都为1格,则有2*2=4个顶点,8个长度的float[]存储)
vertOffset:控制verts数组从第几个数组元素开始对bitmap进行扭曲(忽略verOffset之前数据的扭曲效果);
过程drawPath详解
APIcontour:外形、轮廓,指一次不间断的连线,一个 Path 可以包含多个轮廓。eg:一个圆形,一条曲线都是一个轮廓
addXXX()每一次方法调用都新增了一个独立的轮廓
xxxTo()每一次断线(即每一次「抬笔」),都标志着一个轮廓的结束,以及一个新的轮廓的开始
1.addXXX 添加轮廓(完整封闭图形 除addPath)
Path也可以添加基本图形,addCircle、addRect、addPath(Path path) 添加另一个 Path
eg:addCircle(float x, float y, float radius, Direction dir) 添加圆,参数:圆的基本信息,画圆的路径方向
Direction路径方向:Path.Direction.CW 顺时针,CCW 逆时针
Direction只在图形出现自相交并且需要填充图形,用于判断填充范围时需要
注:如果只是画图形,直接使用canvas.draw图形更方便,path一般用于复杂的组合图形中
2.xxxTo 画线(直线或曲线)
lineTo/ rLineTo(float x, float y) 画直线,从当前位置向目标位置(x,y)画一条直线
区别:lineTo采用绝对坐标,rLineTo采用相对坐标,即把当前位置作为坐标原点来定位目标位置
画直线quadTo(float x1, float y1, float x2, float y2)画二次贝塞尔曲线
贝塞尔曲线:通过起点(当前位置)、控制点(x1, y1)和终点(x2, y2)来描述一条曲线
cubicTo(float x1, float y1, float x2, float y2, float x3, float y3)画三次贝塞尔曲线(两个控制点)
moveTo(float x, float y) 移动到目标位置
由于直线曲线都以当前位置做为绘制起点,使用moveTo可以改变当前位置,间接设置绘制的起点
arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) 画弧形
sweepAngle范围在[-360, 360),不在范围内不绘制
相比canvas.drawArc(),少了参数useCenter,即不用于判断是否连接到圆心,也就不会画扇形
多了参数forceMoveTo,是否强制移动到弧形起点
是否强制移动到弧形起点的区别注:path.addArc()是一个直接使用了 forceMoveTo = true 的简化版 arcTo()
close() 封闭当前轮廓
即由当前位置向当前轮廓的起点绘制一条直线,等价于lineTo(起点坐标)
3.辅助的设置或计算 eg:填充模式
Path.setFillType(Path.FillType ft) 设置填充方式,用来设置图形自相交时的填充算法
取值:EVEN_ODD、WINDING (默认值)、 INVERSE_EVEN_ODD、INVERSE_WINDING
后两个是前两个的取反,所以只需搞懂前两个即可
奇偶相交 方向相交图形方向:addXXX()方向由方法参数Direction控制
xxxTo()线的方向就是图形的方向
对比drawText详解
1.drawText():最基本的根据文字内容和位置进行绘制,也可只绘制部分文字 [ 前开后闭 )
文字绘制从左下角开始, x:从文字最左边留出的空隙开始,y:基线的位置
位置2.drawPosText():指定每个字符的位置(必须全指定)
3.drawTextRun():国外少部分文字需要用到
4.drawTextOnPath():沿着一条 Path 来绘制文字
沿路径绘制文字StaticLayout绘制换行文字
Canvas.drawText() 只能绘制单行的文字,而不能换行,使用换行符也不行
StaticLayout 支持换行的类,不是View/ViewGroup,支持根据宽度上限换行和换行符换行
参数:width 是文字区域的宽度,文字到达这个宽度后就会自动换行;
align 是文字的对齐方向;
spacingmult 是行间距的倍数,通常情况下填 1 就好;
spacingadd 是行间距的额外增加值,通常情况下填 0 就好;
includeadd 是指是否在文字上下添加额外的空间,来避免某些过高的字符的绘制出现越界。
使用:StaticLayout staticLayout = new StaticLayout(text1, paint,600,Layout.Alignment.ALIGN_NORMAL,1,0,true);
staticLayout.draw(canvas);//适用于对文字的排列和样式没有太复杂的花式要求,只需进行多行文字的绘制
网友评论