安卓自定义View基础05-Canvas之基础图形绘制,点,线,矩形,圆,椭圆,弧形等
一.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
扇形扫过的角度,并不是停止时的角度。停止角度 =startAngle
+sweepAngle
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之基础图形绘制,点,线,矩形,圆,椭圆,弧形等相关推荐
- android控件向内弧度_安卓自定义 View 基础:坐标系、角度弧度、颜色
安卓自定义View基础 - 坐标系 一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是 ...
- 安卓自定义view全解:初始化,onDraw函数,onMeasure函数,用户手势事件
全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓自定义view全解. view类包含如下函数.可供重写. onFinishInflate() 回调方法,当应用从XML加载该组件并用它构建界面之后 ...
- 安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例
安卓自定义view中 绘画基本图形点线面,矩形,方形,圆,扇形,文字及沿着特定方向布局,自定义圆角ImageView图片等等相关api使用方法及举例,图片压缩处理逻辑 本文旨在介绍自定义View的实现 ...
- 【Android】自定义View、画布Canvas与画笔Paint
安卓自定义View其实很简单.这个View可以像<[Android]利用Java代码布局,按钮添加点击事件>(点击打开链接)一样,利用Java代码生成一系列的组件.也可以配合画布Canva ...
- 安卓自定义View实现加载gif图片
开题:加载GIF的场景在安卓开发中还比较常见,网上也有一些三方法的框架会支持对gif的加载,在上篇博客为大家推荐的图片加载库Glide也支持gif的加载Glide工具类的简单封装,今天给大家分享通过自 ...
- 安卓自定义View——网易颜色渐变效果指示器
一直想写博客来着,可惜直到现在才真正抽出时间.最近一直在研究网易新闻这个UI框架,发现了一些很值得借鉴的效果,当然,网上也不乏这方面的介绍.本文主要实现的指示器效果为字体颜色和大小渐变,废话不多说献上 ...
- 安卓自定义View的状态保存与恢复
安卓自定义View的状态保存与恢复 我们在开发某些安卓应用(如安卓小游戏)时,可能会用到自定义View,这时候往往需要保存自定义View的状态信息,以便在遇到某些情况(如由于系统内存资源紧张被系统杀死 ...
- 安卓自定义View进阶-事件分发机制原理
之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部分的需求都能满足,但是关于View还有很多知识 ...
- Android自定义View简单实现手绘折(曲)线滚动图效果
目录 一.简介 二.实现 三.代码 四.实现效果 一.简介 通过安卓自定义View实现根据手指点击或移动轨迹绘制出折(曲)线图并循环滚动. 二.实现 获取手指点击和移动的y坐标存入数组,设定好x间隔, ...
最新文章
- 【转】ibatis的简介与初步搭建应用
- 聚类(序)——监督学习与无监督学习
- wss代码执行的权限提升
- 用户空间使用内核头文件
- c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...
- CBOW模型的学习、Trainer类的实现
- 服务器怎么控制忽略样式_看问题要看到本质:从Web服务器说起
- EditPlus 快捷键大全
- MEGA-X 3D打印机教程:01_我的第一台3D打印机参数
- 计算机内存die,从内存时序的角度告诉你 三星B-DIE为何成为高端所用
- 宽带远端服务器无响应什么意思,宽带远程服务器无响应
- c语言程序设计基本模板,《C语言程序设计基础教程》试讲教案模板
- 2021年6月上市公司新闻舆论事件分析报告合集
- Tiny210--3--基于Tiny210的CMOS摄像头图像采集
- java输入两个数字和运算符_java 第二天运算符及录入函数Scanner
- CompletableFuture的正常,异常,timeout和cancel
- hp vse虚拟服务器,HP9000用户升级硬件平台的捷径
- hugetable和mysql区别_BigData-MySQL总结大全(一)苏暖人
- Java新手上路--算数运算符
- 计算机一打开就卡在更新失败,电脑卡在配置Windows Update失败界面怎么解决