开篇之言:

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

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

—— 《满江红  壮志》吴缘

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

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,这里注意一下。

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针对的都是数值。

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,圆形的,弧形的,是跟圆、弧有关的单词,是不是有些明了了?如果还是不清楚,看下面这张图就知道了。

第一个参数是一个精准度的矩形,第二个第三个参数是边角圆弧的大小,分别是生成边角圆弧的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)。是不是有些拗口难懂,没关系,看下面的图你就了解了。

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):    旋转画布。

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点   第四个参数是画笔

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

  1. java框架基础教程_Java零基础教学,分分钟掌握基础学习框架

    原标题:Java零基础教学,分分钟掌握基础学习框架 想学Java,刚开始有没有觉得无从下手呢?其实Java的基础知识点,并不多,但是一定要吃透,因为这是为后续核心的学习打下一个良好的基础.简单来说,就 ...

  2. CorelDRAW X6 零基础教学入门

    CorelDRAW X6 零基础教学入门 1.1 CDRX6 新建与保存.打开与关闭文档 http://v.youku.com/v_show/id_XMTY5MTM4MDAyNA==.html 1.2 ...

  3. 零基础学画画有什么快速的方法

    零基础学画画有什么快速的方法?学画画的技巧有很多,先学一点造型最好,先画一些几何图形的物体,如苹果,鸡蛋等.这样,可以很好的煅练眼和手,等学好了基础功后再画一些难一点的形.练习形体也是最基础的,生活中 ...

  4. c语言python零基础教学_编程零基础应当如何开始学习 Python?附教程

    零基础学编程,用python入门是个不错的选择,虽然国内基本上还是以c语言作为入门开发语言,但在国外,已经有很多的学校使用python作为入门编程语言.此外,python在机器学习,人工智能领域也非常 ...

  5. c语言python零基础教学_编程零基础应当如何开始学习 Python?

    目录 1.学习了解Python的基础知识. 2.安装Python,边学边练. 3.收集资料,作为练习指引. 4.确定学习方向,项目练手. 5.学习过程中要注意多练.多问! 编程零基础选择Python开 ...

  6. B站百万播放量Java零基础教程视频(适合Java 0基础,Java初学入门),史上最细Java零基础教学视频

    是否还在为学习Java如何入门而烦恼? 是否还在为Java软件如何安装而烦恼? 是否还在找寻着适合零基础的Java视频教程? 动力节点教学总监老杜159集课堂实录Java零基础视频教程,从初学者角度出 ...

  7. 基于STM32的最小系统电路设计(手把手零基础教学)

    文章目录 前言 一.复位电路 二.晶振电路 三.电源转换电路 四.SWD下载电路 五.LED测试电路 六.芯片外扩引脚 七.STM32微控制电路 总结 前言    在上篇介绍完<STM32的核心 ...

  8. 前端零基础教学开始第一天 01 -day

    引言: 我所教授的前端知识适用于纯小白,零基础.以后未来发展方向是前端领域,需要系统学习的人,从零到1的人 转载需备注地址---- 我是(我想静静)一个要把代码写出艺术感的人! 写代码的男人很帅气! ...

  9. python语言学习零基础教学视频_零基础学Python语言CAP全套课程

    零基础学Python语言CAP完整版课程目录 ├─{1}–[第1周,第一单元]Python编程之基本方法 │ ├─{1}–1.1课程内容和安排介绍 │ │ ├─(1.1.1)–课程内容和安排介绍-PP ...

最新文章

  1. OCS 2007 聊天记录查看工具 OCSMessage
  2. Xamarin.FormsShell基础教程(6)Shell项目内容详情页面
  3. Webbench网站压力测试
  4. 第10章-定位、层级关系
  5. python的特性是_python的特性
  6. OpenLayers WFS指定地理范围查询
  7. 网红品牌,都是“营销狗”?
  8. 配置quick-cocos2d-x-develop OpenGL version too old
  9. vim:复制复制字符到vim的命令行窗口的4种方法
  10. your ps needs to be repaired_同一张人像照片,25 个国家的PS后!!!
  11. 开源中国源码学习(八)——枚举类
  12. 3x3矩阵怎么求逆矩阵_矩阵型组织结构,郭士纳与任正非都是怎么说的?
  13. java 从入门到精通PDF
  14. python 数据挖掘论文_基于python的WEB数据挖掘技术实现与研究
  15. 思科模拟器中的交换机使用方法
  16. 腾达ap设置说明_腾达(Tenda)F3无线信号放大模式(Client+AP)设置 | 192路由网
  17. WIN10家庭版增加本地安全策略
  18. emoji表情乱码php,推送emoji表情乱码的解决方法
  19. IDEA部署Java项目时HTML,CSS等静态资源在网页上显示有问题的解决办法
  20. python中seaborn是什么_Python数据分析之seaborn常用方法

热门文章

  1. 关于婚姻,你能事先回答这些问题吗?(来自网络)
  2. 【玩转SQLite系列】(二)SQLite创建和打开数据库的三种方式
  3. 一起Talk Android吧(第四百二十回:贝塞尔曲线)
  4. 他们说找合伙人就像找女朋友!
  5. 30个实用的沟通技巧
  6. mate30pro鸿蒙系统安装教程,华为mate30pro升级鸿蒙系统步骤 教程如下
  7. 2023年云计算领域五大趋势
  8. Docker之旅:在Docker容器中创建第一个程序
  9. poi 解析中文_百度地图周边最近的POI查询并且解析出中文地址
  10. #core dump# strip命令