美文网首页
Canvas绘制类

Canvas绘制类

作者: jadefly | 来源:发表于2018-11-01 17:12 被阅读0次

    绘制类: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详解

    API

    contour:外形、轮廓,指一次不间断的连线,一个 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);//适用于对文字的排列和样式没有太复杂的花式要求,只需进行多行文字的绘制

    相关文章

      网友评论

          本文标题:Canvas绘制类

          本文链接:https://www.haomeiwen.com/subject/hpeatqtx.html