自定义控件零基础教学(四)—— canvas画布的所有方法
开篇之言:
纵败不悔,寒窗苦、笑我狂癫。提泰笔、入木痕刻,飞鸿闪现。千军万马轻壶酒,卷湖题海嗜血鲜。心难平、满腔壮志筹,上九天。
群雄起,逐鹿间。金戈响、铁马撼。挑夜灯看剑,策打霜鞭。唇破紧齿更激昂,叫得草发愈凌乱。怎停休、为高夏龙门,一朝战!
—— 《满江红 壮志》吴缘
上面这首词是我复读时奋发图强下所作,为的是时时提醒自己,鞭策自己。现在送给正在努力学习的各位同学,生活即是不得意也要比安逸强上许多。
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画布的所有方法相关推荐
- java框架基础教程_Java零基础教学,分分钟掌握基础学习框架
原标题:Java零基础教学,分分钟掌握基础学习框架 想学Java,刚开始有没有觉得无从下手呢?其实Java的基础知识点,并不多,但是一定要吃透,因为这是为后续核心的学习打下一个良好的基础.简单来说,就 ...
- CorelDRAW X6 零基础教学入门
CorelDRAW X6 零基础教学入门 1.1 CDRX6 新建与保存.打开与关闭文档 http://v.youku.com/v_show/id_XMTY5MTM4MDAyNA==.html 1.2 ...
- 零基础学画画有什么快速的方法
零基础学画画有什么快速的方法?学画画的技巧有很多,先学一点造型最好,先画一些几何图形的物体,如苹果,鸡蛋等.这样,可以很好的煅练眼和手,等学好了基础功后再画一些难一点的形.练习形体也是最基础的,生活中 ...
- c语言python零基础教学_编程零基础应当如何开始学习 Python?附教程
零基础学编程,用python入门是个不错的选择,虽然国内基本上还是以c语言作为入门开发语言,但在国外,已经有很多的学校使用python作为入门编程语言.此外,python在机器学习,人工智能领域也非常 ...
- c语言python零基础教学_编程零基础应当如何开始学习 Python?
目录 1.学习了解Python的基础知识. 2.安装Python,边学边练. 3.收集资料,作为练习指引. 4.确定学习方向,项目练手. 5.学习过程中要注意多练.多问! 编程零基础选择Python开 ...
- B站百万播放量Java零基础教程视频(适合Java 0基础,Java初学入门),史上最细Java零基础教学视频
是否还在为学习Java如何入门而烦恼? 是否还在为Java软件如何安装而烦恼? 是否还在找寻着适合零基础的Java视频教程? 动力节点教学总监老杜159集课堂实录Java零基础视频教程,从初学者角度出 ...
- 基于STM32的最小系统电路设计(手把手零基础教学)
文章目录 前言 一.复位电路 二.晶振电路 三.电源转换电路 四.SWD下载电路 五.LED测试电路 六.芯片外扩引脚 七.STM32微控制电路 总结 前言 在上篇介绍完<STM32的核心 ...
- 前端零基础教学开始第一天 01 -day
引言: 我所教授的前端知识适用于纯小白,零基础.以后未来发展方向是前端领域,需要系统学习的人,从零到1的人 转载需备注地址---- 我是(我想静静)一个要把代码写出艺术感的人! 写代码的男人很帅气! ...
- python语言学习零基础教学视频_零基础学Python语言CAP全套课程
零基础学Python语言CAP完整版课程目录 ├─{1}–[第1周,第一单元]Python编程之基本方法 │ ├─{1}–1.1课程内容和安排介绍 │ │ ├─(1.1.1)–课程内容和安排介绍-PP ...
最新文章
- OCS 2007 聊天记录查看工具 OCSMessage
- Xamarin.FormsShell基础教程(6)Shell项目内容详情页面
- Webbench网站压力测试
- 第10章-定位、层级关系
- python的特性是_python的特性
- OpenLayers WFS指定地理范围查询
- 网红品牌,都是“营销狗”?
- 配置quick-cocos2d-x-develop OpenGL version too old
- vim:复制复制字符到vim的命令行窗口的4种方法
- your ps needs to be repaired_同一张人像照片,25 个国家的PS后!!!
- 开源中国源码学习(八)——枚举类
- 3x3矩阵怎么求逆矩阵_矩阵型组织结构,郭士纳与任正非都是怎么说的?
- java 从入门到精通PDF
- python 数据挖掘论文_基于python的WEB数据挖掘技术实现与研究
- 思科模拟器中的交换机使用方法
- 腾达ap设置说明_腾达(Tenda)F3无线信号放大模式(Client+AP)设置 | 192路由网
- WIN10家庭版增加本地安全策略
- emoji表情乱码php,推送emoji表情乱码的解决方法
- IDEA部署Java项目时HTML,CSS等静态资源在网页上显示有问题的解决办法
- python中seaborn是什么_Python数据分析之seaborn常用方法