自定义控件零基础教学(四)—— canvas画布的所有方法

时间:2023-02-13 18:17:32

开篇之言:

        纵败不悔,寒窗苦、笑我狂癫。提泰笔、入木痕刻,飞鸿闪现。千军万马轻壶酒,卷湖题海嗜血鲜。心难平、满腔壮志筹,上九天。

        群雄起,逐鹿间。金戈响、铁马撼。挑夜灯看剑,策打霜鞭。唇破紧齿更激昂,叫得草发愈凌乱。怎停休、为高夏龙门,一朝战!

                                                                                                                 —— 《满江红  壮志》吴缘


        上面这首词是我复读时奋发图强下所作,为的是时时提醒自己,鞭策自己。现在送给正在努力学习的各位同学,生活即是不得意也要比安逸强上许多。

        

Canvas

        canvas,字画布,onDraw()方法常驻人士,平生善交好友,与Paint、Path等交往密切。故胸中富有韬略,可惜常让人望而生畏。

        大家可不要以为我上面这段话是随便说说,逗大家开心的。不信自己打开AndroidStudio,在onDraw()方法里canvas.点一下,看看有多少方法,初学者一看头都大了。

        还记得第一篇文章中我跟大家说的,学习IT知识的时候,尽量去思考现实生活中相同的现象,最好是和思考代码一起,这样事半功倍。所以问题来了,现实中,画布都有什么用处?首先第一个功能,也是最大的功能,就是能够在其上面绘画。第二个功能,我们可以对画布本身进行操作,翻转、折叠、裁剪等等。

        同样的,别看canvas方法特多,总体来说,也就分为两大类。

        绘制类方法和操作类方法。


绘制类型方法

        这么多方法中,那又有哪些方法是绘制类型的方法呢?其实很好分辨,只要你知道一个单词就行了。draw,绘制绘画。

        凡方法是drawXXXX之类的,都是绘制类型方法,除此之外可以说都是对画布进行操作的操作类型方法。而绘制类型方法也可大体分为四类:绘制几何图形的、绘制图片的、绘制文字的、根据路径来绘制的。

        捋清思路后,canvas也就没有看上去那么难了。

1.绘制几何图形的

        这里跟同学们提一点,在绘制几何图形时,画笔要进行描边或填满的设置,不然默认是填满。

        drawRect(float l,float t,float r,float b,Paint paint):    这是用来绘制矩形的,前面四个参数就是矩形的左上角和右下角两个点的坐标,最后一个就是传入的画笔Paint了,这个方法很好理解,但也要去亲手试试,这样才能学会。

        drawArc(RectF oval,float startAngle,float sweepAngle,boolean useCenter,Paint paint):    这是用来绘制弧线的,第一个参数Rect是矩形的意思,后面加了个F代表精准度。RectF和Rect的用法一样,它们的区别就像float和double的区别,精确度的问题,都是跟矩形相关的;第二个参数,start,开始的意思。Angle,角度的意思,所以总体意思就是开始的角度;第三个参数,sweep 扫过,掠过的意思,所以总体意思就是扫过的角度;第四个参数的意思是,是否使用中心点?这里的使用中心点的意思代表的是是否通过中心点连接弧线的两边;第五个参数Paint,这个大家都知道的。

        下面我将通过画图的方式跟大家讲解这个方法是如何去用,去体现出来的。这个方法要求的最低API等级是21,这里注意一下。

自定义控件零基础教学(四)—— canvas画布的所有方法

    

        drawCircle(float cx,float cy,float radius,Paint paint):    第一个参数,圆心的x坐标;第二个参数,圆心的y坐标;第三个参数,圆心的半径;第四个参数,画笔。这个方法比较容易,就是根据圆心坐标画一个半径为多大的圆就行了。

        drawLine(float startX,float startY,float stopX,float stopY,Paint paint):    Line,线条线段。没错,这是画线段的方法。第一第二参数就是开始的xy坐标,第三第四参数就是结束的xy坐标,第五个参数,画笔。这也很好理解,下面我用画图的方式跟大家讲解一下drawLines(float[] pts,Paint paint)和drawLines(float[] pts,int offset,int count,Paint paint)这两个方法。

        在此之前先跟大家提一下,在float[] pts数组中,两个数值为一个点的坐标,是成双成对的。int offset和int count针对的都是数值。

自定义控件零基础教学(四)—— canvas画布的所有方法

        drawOval(RectF rectF,Paint paint):    这个是画椭圆的,跟画弧线一样的原理,都是根据矩形绘制的,这个不难,就不多费唇舌了,当然了,同学们还是亲手试试,传递不同的矩形看看效果。

     drawPoint(float x,float y,Paint paint):    这个方法是画点的,跟画线段drawLine一样的用法,同样也有drawPoints(float[] pts,Paint paint)和drawPoints(float[] pts,int offset,int count,Paint paint)这两个方法,一样的道理,同学们可以去试试。

        drawRoundRect(RectF rectF,float rx,float ry,Paint paint):    这个方法也是画矩形的,但跟drawRect不同的一点就是在边角的地方不是直线而是弧线,这里先看看round的意思,round,圆形的,弧形的,是跟圆、弧有关的单词,是不是有些明了了?如果还是不清楚,看下面这张图就知道了。

自定义控件零基础教学(四)—— canvas画布的所有方法

        第一个参数是一个精准度的矩形,第二个第三个参数是边角圆弧的大小,分别是生成边角圆弧的x轴半径和y轴半径,第四个参数是画笔。

        

2.绘制图片的

        绘制图片的就两个方法(不算重载的)drawPicture和drawBitmap。

        drawBitmap(Bitmap bitmap,float left,float top,Paint paint):    第一个参数,bitmap 位图图片的意思。第二第三个参数是在哪里开始绘制,这里是根据原点作为参考的,是从图片左上角开始绘制的,第四个参数,画笔。这里跟大家说一下bitmap的生成方式。

        1.通过资源文件获取Bitmap(drawable/mipmap/raw)

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.xxx);

        2.通过assets获取

Bitmap bitmap = null;
        try {
            InputStream inputStream = mContext.getAssets().open("dafenqi.png");
            bitmap = BitmapFactory.decodeStream(inputStream);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

       3.通过内存卡

Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/bitmap.png");  

       4.通过网络

// 此处省略了获取网络输入流的代码  
       Bitmap bitmap = BitmapFactory.decodeStream(is);  
       is.close();  

       drawBitmap(Bitmap bitmap,Rect src,Rect dst,Paint paint):    这个方法是先在源图像中选取一个区域(src),然后再画布上选择一个区域进行绘制(dst)。是不是有些拗口难懂,没关系,看下面的图你就了解了。

自定义控件零基础教学(四)—— canvas画布的所有方法


        drawPictrue():    这个方法我不怎么用,所以这里也就不跟同学们说了,感兴趣的可以去看下这位大神的博客。自定义View起步:Canvas之绘制图片


3.绘制文字的

        drawText(String text,float x,float y,Paint paint):    这个方法有很多重载,都是相同的,差别不大,这里就推荐常用也是最简单的用法。第一个参数是String类型的文本内容,第二第三个参数是绘制的起点坐标,第四个参数是画笔。在之前就说过了,绘制文字时的起点是左下角,并不是以往的以左上角为起点,这里再声明一次。

        drawTextOnPath(String text,Path path,float hOffset,float vOffset,Paint paint):    这个方法是使要绘制的内容按照指定的路径去绘制,如果路径是弯的,则一行文字的显示也是弯的,在这里可以去联想一下印章印在纸上的字,那围绕刻印上一圈的文字。第一个参数是绘制的文本内容,第二个参数是路径,第三个参数代表在路径上水平的偏移量,第四个参数代表在路径上垂直方向上的偏移量,第五个参数是画笔。

        drawTextRun():     这个方法对于中国汉字和英语来说是毫无用处的,所以这里不建议去理解,除非需求要外国语言。

        drawPosText():    这个方法已经过时了。


4.根据路径绘制的

        drawPath(Path path ,Paint paint):    第一个参数,路径。第二个参数,画笔。使用这个方法之前需了解Path类,所以在后面讲Path会讲,在这里讲述的话不仅偏题,也会显得繁杂。

操作类型方法

        translate(float dx,float dy):    移动画布的原点,这里的移动量是一个偏移量。比如说,我们translate(100,100),那么画布的原点就从(0,0)移动到了(100,100),如果我们再translate(200,200),那么原点将会变成(300,300),而不是(200,200)。

        save():    保存画布当前状态。在现实生活中,画布可以进行旋转、裁剪、移动等等操作,然而这些操作都是不可逆的,每执行一次,都会偏离原来画布的位置和状态,如果我们想正常的完成绘画,则在想要进行这些操作之前先保存好画布,等我们弄完了这些操作后,我们再恢复画布原来的样子。

        restore():    回滚画布,也就是恢复上次保存好的画布状态。

        rotate(float degrees):    旋转画布。

自定义控件零基础教学(四)—— canvas画布的所有方法

        scale(float sx,float sy):    缩放画布。按照比例缩放的画布,在原画布状态中绘制的图像将会以比例缩放显示,默认缩放点为原点(0,0)。


        还有其它的方法没有一一介绍了,因为很多有些是雷同的,有些是重载方法,用法都差不多,有的是已经过时的,也有的是我很少用的,对其不是很了解。累的很,光是写完这些就花了我半个下午和一晚上的时间。下一篇就教授上面几个常用的基础的方法的使用详例。下面是上一篇布置的题目的代码。


mPiant.setStyle(Paint.Style.STROKE);
    mPiant.setColor(Color.BLUE);
    canvas.drawRect(20,20,650,90,mPiant);
    mPiant.setColor(Color.BLACK);
    mPiant.setTextSize(50);
    canvas.drawText("客舟于此,却不愿随波逐流。",20,70,mPiant);
    //第一个参数是绘制的文本内容   第二个参数是绘制的x点  第三个参数是绘制的y点   第四个参数是画笔