一.Canvas简介

Canvas我们可以称之为画布,能够在上面绘制各种东西,是安卓平台2D图形绘制的基础,
源码中关于Canvas的解释:

The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).
The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).

想要画出一个View就必须要有4个必要的元素:
1.保存像素的Bitmap
2.管理绘制请求的Canvas
3.绘画的原始基本元素,例如矩形,线,文字,Bitmap
4.拥有颜色和风格信息的画笔

二.Canvas常用方法介绍

操作类型 相关API 备注
绘制颜色 drawColor, drawRGB, drawARGB 使用单一颜色填充整个画布
绘制基本形状 drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧
绘制图片 drawBitmap, drawPicture 绘制位图和图片
绘制文本 drawText, drawPosText, drawTextOnPath 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字
绘制路径 drawPath 绘制路径,绘制贝塞尔曲线时也需要用到该函数
顶点操作 drawVertices, drawBitmapMesh 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用
画布剪裁 clipPath, clipRect 设置画布的显示区域
画布快照 save, restore, saveLayerXxx, restoreToCount, getSaveCount 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数
画布变换 translate, scale, rotate, skew 依次为 位移、缩放、 旋转、错切
Matrix(矩阵) getMatrix, setMatrix, concat 实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。

|PS: Canvas常用方法在上面表格中已经全部列出了,当然还存在一些其他的方法未列出,具体可以参考官方文档

三、Canvas绘制常见图行详解

1.绘制颜色:

绘制颜色是填充整个画布,常用于绘制底色。即View的背景色

canvas.drawColor(Color.BLUE); //绘制蓝色

2.初始化画笔

   private void init(){mPaint = new Paint();mPaint.setColor(Color.BLUE);//设置画笔颜色mPaint.setStyle(Paint.Style.FILL);//设置画笔模式为填充mPaint.setAntiAlias(true);//是否抗锯齿mPaint.setStrokeWidth(10f); //设置画笔宽度为10px}
 private Paint mPaint;public MyCoustomView(Context context) {super(context);init();}public MyCoustomView(Context context, AttributeSet attrs) {super(context, attrs);init();}public MyCoustomView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}

画笔创建完之后就可以开始绘制各种图形了

 需要指出的是,我们并没有重写onMeasure(),则改view的大小默认是屏幕的大小,关于onMeasure() 我们会放到后面详细讲解

a> 画 点

  canvas.drawPoint(100,100,mPaint);//在坐标(100,100)的位置画一个点canvas.drawPoints(new float[]{   //绘制一组点,坐标位置由float数组指定500,500,500,600,500,700},mPaint);

b> 划 线

  划线的话,里面的参数分别是起点坐标,重点坐标,以及画笔
       canvas.drawLine(300,300,500,600,mPaint);    // 在坐标(300,300)(500,600)之间绘制一条直线canvas.drawLines(new float[]{               // 绘制一组线 每四数字(两个点的坐标)确定一条线100,200,200,200,100,300,200,300},mPaint);

c> 画矩形

  • drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)
  • 矩形用两个点来确定他的位置和大小,即用矩形的左上和右下两个点来确定矩形的大小,方法中的两个点的坐标即是矩形的左上右下两个点的坐标
        // 第一种canvas.drawRect(100,100,800,400,mPaint);// 第二种mPaint.setColor(Color.GREEN);Rect rect = new Rect(100,500,800,800);canvas.drawRect(rect,mPaint);// 第三种mPaint.setColor(Color.RED);RectF rectF = new RectF(100,900,800,1200);canvas.drawRect(rectF,mPaint);

d> 画圆角矩形

下面简单解析一下圆角矩形的几个必要的参数的意思。

很明显可以看出,第二种方法前四个参数和第一种方法的RectF作用是一样的,都是为了确定一个矩形,最后一个参数Paint是画笔,无需多说,与矩形相比,圆角矩形多出来了两个参数rx 和 ry,这两个参数是干什么的呢?

稍微分析一下,既然是圆角矩形,他的角肯定是圆弧(圆形的一部分),我们一般用什么确定一个圆形呢?

答案是圆心 和 半径,其中圆心用于确定位置,而半径用于确定大小。

由于矩形位置已经确定,所以其边角位置也是确定的,那么确定位置的参数就可以省略,只需要用半径就能描述一个圆弧了。

但是,半径只需要一个参数,但这里怎么会有两个呢?

好吧,让你发现了,这里圆角矩形的角实际上不是一个正圆的圆弧,而是椭圆的圆弧,这里的两个参数实际上是椭圆的两个半径,他们看起来个如下图:

       // 第一种mPaint.setColor(Color.parseColor("#C7EDCC"));RectF rectF = new RectF(100,100,800,400);canvas.drawRoundRect(rectF,30,30,mPaint);// 第二种mPaint.setColor(Color.parseColor("#FF00FF"));canvas.drawRoundRect(100,500,800,800,30,30,mPaint);

e>画椭圆

相对于绘制圆角矩形,绘制椭圆就简单的多了,因为他只需要一个矩形矩形作为参数:

        // 第一种mPaint.setColor(Color.parseColor("#FF1493"));RectF rectF = new RectF(100,100,800,400);canvas.drawOval(rectF,mPaint);//第二种mPaint.setColor(Color.parseColor("#4B0082"));canvas.drawOval(100,600,800,900,mPaint);

f>画 圆

  • drawCircle(float cx, float cy, float radius, @NonNull Paint paint)
  • radius: 半径
    cx : 圆心的x坐标
    cy : 圆心的y坐标
    使用的时候需要考虑圆心和半径
        mPaint.setColor(Color.parseColor("#40E0D0"));canvas.drawCircle(getWidth()/2,getHeight()/2,400,mPaint);

g>画 弧

drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint)

  • float startAngle 开始绘制的角度
  • float sweepAngle 扇形扫过的角度,并不是停止时的角度。停止角度 = startAnglesweepAngle
  • boolean useCenter ture就是有焦点圆心 , false 没有

1.以矩形为背景画弧形

    /*第一种*/RectF rectF = new RectF(100,100,800,400);// 绘制背景矩形mPaint.setColor(Color.parseColor("#008080"));canvas.drawRect(rectF,mPaint);// 绘制圆弧mPaint.setColor(Color.BLUE);canvas.drawArc(rectF,0,90,false,mPaint);//参数为false的时候/*第二种*/RectF rectF2 = new RectF(100,500,800,900);// 绘制背景矩形mPaint.setColor(Color.parseColor("#008080"));canvas.drawRect(rectF2,mPaint);// 绘制圆弧mPaint.setColor(Color.BLUE);canvas.drawArc(rectF2,0,60,true,mPaint);//参数为true的时候

在正方形的基础上画圆弧

         RectF rectF2 = new RectF(100,100,800,800);
        // 绘制背景矩形mPaint.setColor(Color.parseColor("#008080"));canvas.drawRect(rectF2,mPaint);// 绘制圆弧mPaint.setColor(Color.parseColor("#EE82EE"));canvas.drawArc(rectF2,0,60,ture,mPaint);mPaint.setColor(Color.parseColor("#00FFFF"));canvas.drawArc(rectF2,60,30,true,mPaint);

        RectF rectF2 = new RectF(100,100,800,800);// 绘制背景矩形mPaint.setColor(Color.parseColor("#008080"));canvas.drawRect(rectF2,mPaint);// 绘制圆弧mPaint.setColor(Color.parseColor("#EE82EE"));canvas.drawArc(rectF2,0,60,false,mPaint);mPaint.setColor(Color.parseColor("#00FFFF"));canvas.drawArc(rectF2,60,30,false,mPaint);

安卓自定义View基础05-Canvas之基础图形绘制,点,线,矩形,圆,椭圆,弧形等相关推荐

  1. android控件向内弧度_安卓自定义 View 基础:坐标系、角度弧度、颜色

    安卓自定义View基础 - 坐标系 一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是 ...

  2. 安卓自定义view全解:初始化,onDraw函数,onMeasure函数,用户手势事件

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓自定义view全解. view类包含如下函数.可供重写. onFinishInflate() 回调方法,当应用从XML加载该组件并用它构建界面之后 ...

  3. 安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例

    安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例,图片压缩处理逻辑 本文旨在介绍自定义View的实现 ...

  4. 【Android】自定义View、画布Canvas与画笔Paint

    安卓自定义View其实很简单.这个View可以像<[Android]利用Java代码布局,按钮添加点击事件>(点击打开链接)一样,利用Java代码生成一系列的组件.也可以配合画布Canva ...

  5. 安卓自定义View实现加载gif图片

    开题:加载GIF的场景在安卓开发中还比较常见,网上也有一些三方法的框架会支持对gif的加载,在上篇博客为大家推荐的图片加载库Glide也支持gif的加载Glide工具类的简单封装,今天给大家分享通过自 ...

  6. 安卓自定义View——网易颜色渐变效果指示器

    一直想写博客来着,可惜直到现在才真正抽出时间.最近一直在研究网易新闻这个UI框架,发现了一些很值得借鉴的效果,当然,网上也不乏这方面的介绍.本文主要实现的指示器效果为字体颜色和大小渐变,废话不多说献上 ...

  7. 安卓自定义View的状态保存与恢复

    安卓自定义View的状态保存与恢复 我们在开发某些安卓应用(如安卓小游戏)时,可能会用到自定义View,这时候往往需要保存自定义View的状态信息,以便在遇到某些情况(如由于系统内存资源紧张被系统杀死 ...

  8. 安卓自定义View进阶-事件分发机制原理

    之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部分的需求都能满足,但是关于View还有很多知识 ...

  9. Android自定义View简单实现手绘折(曲)线滚动图效果

    目录 一.简介 二.实现 三.代码 四.实现效果 一.简介 通过安卓自定义View实现根据手指点击或移动轨迹绘制出折(曲)线图并循环滚动. 二.实现 获取手指点击和移动的y坐标存入数组,设定好x间隔, ...

最新文章

  1. 【转】ibatis的简介与初步搭建应用
  2. 聚类(序)——监督学习与无监督学习
  3. wss代码执行的权限提升
  4. 用户空间使用内核头文件
  5. c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...
  6. CBOW模型的学习、Trainer类的实现
  7. 服务器怎么控制忽略样式_看问题要看到本质:从Web服务器说起
  8. EditPlus 快捷键大全
  9. MEGA-X 3D打印机教程:01_我的第一台3D打印机参数
  10. 计算机内存die,从内存时序的角度告诉你 三星B-DIE为何成为高端所用
  11. 宽带远端服务器无响应什么意思,宽带远程服务器无响应
  12. c语言程序设计基本模板,《C语言程序设计基础教程》试讲教案模板
  13. 2021年6月上市公司新闻舆论事件分析报告合集
  14. Tiny210--3--基于Tiny210的CMOS摄像头图像采集
  15. java输入两个数字和运算符_java 第二天运算符及录入函数Scanner
  16. CompletableFuture的正常,异常,timeout和cancel
  17. hp vse虚拟服务器,HP9000用户升级硬件平台的捷径
  18. hugetable和mysql区别_BigData-MySQL总结大全(一)苏暖人
  19. Java新手上路--算数运算符
  20. 计算机一打开就卡在更新失败,电脑卡在配置Windows Update失败界面怎么解决

热门文章

  1. sqlite3导出csv首位0_运动手表GPS轨迹文件导出方法
  2. 阿里云服务器从购买到项目部署详细流程
  3. ORACLE中每个分组后加个合计,最后总合计的GROUP BY rollup,和中文排序
  4. 【混淆工具】保护Net程序代码安全
  5. 带负荷测试要求二次最小电流_互感器二次负荷在线测试方法与流程
  6. 树形选择变成表格树选择
  7. 基于AT89C52单片机的无线温度监测设计
  8. Excel实用操作技巧
  9. 通过简书网学习 ActionChains,selenium webdriver 学习第3篇
  10. OPT锂电焊缝缺陷检测方案