一.Canvas简介
Canvas我们可以称之为画布,能够在上面绘制各种东西,是安卓平台2D图形绘制的基础,非常强大。
二.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比较难以理解和使用,故封装了一些常用的方法。 |
三.Canvas详解
绘制颜色
绘制颜色是填充整个画布,常用于绘制底色。
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawColor(Color.RED); //绘制红色
}
创建画笔
要想绘制内容,首先需要先创建一个画笔,如下:
//创建画笔
private Paint mPaint = new Paint();
/**
* 初始化一些的内容,和获取自定义属性。
* @param context
* @param attrs
*/
public CustomView(Context context, AttributeSet attrs)
{
super(context, attrs);
//初始化画笔
initPaint();
}
private void initPaint()
{
//设置画笔颜色
mPaint.setColor(Color.RED);
//设置画笔模式
mPaint.setStyle(Paint.Style.FILL);
//设置画笔宽度
mPaint.setStrokeWidth(10f);
//设置抗锯齿
mPaint.setAntiAlias(true);
}
绘制点
可以绘制一个点,也可以绘制一组点,如下:
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawColor(Color.RED); //绘制红色
//在坐标(350,400处画一个点
canvas.drawPoint(350,400,mPaint);
canvas.drawPoint(300,400,mPaint);
//画多个点
canvas.drawPoints(new float[]{400,400,400,500,400,600,400,700,400,800,400,900},mPaint);
}
绘制直线
绘制直线需要两个点,初始点和结束点,同样绘制直线也可以绘制一条或者绘制一组
//在坐标(100,100)和(600,100)之间画一条线
canvas.drawLine(100,100,600,100,mPaint);
//画多条线
canvas.drawLines(new float[]{100,150,600,150,100,200,600,200,100,250,600,250},mPaint);
绘制矩形
确定确定一个矩形最少需要四个数据,就是对角线的两个点的坐标值,这里一般采用左上角和右下角的两个点的坐标。
// 第一种
canvas.drawRect(100,100,800,400,mPaint);
// 第二种
Rect rect = new Rect(100,100,800,400);
canvas.drawRect(rect,mPaint);
// 第三种
RectF rectF = new RectF(100,100,800,400);
canvas.drawRect(rectF,mPaint);
注:Rect和RectF两者最大的区别就是精度不同,Rect是int(整形)的,而RectF是float(单精度浮点型)的。
绘制圆角矩形
//绘制圆角矩形
RectF rectF = new RectF(100,100,600,300);
canvas.drawRoundRect(rectF,20,20,mPaint);
绘制椭圆
相对于绘制圆角矩形,绘制椭圆就简单的多了,因为他只需要一个矩形矩形作为参数
//绘制椭圆
RectF rectF = new RectF(100,100,600,400);
canvas.drawOval(rectF,mPaint);
绘制圆
// 绘制一个圆心坐标在(360,400),半径为300 的圆。
canvas.drawCircle(360,400,300,mPaint);
绘制圆弧
public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint){}
从上面可以看出,相比于绘制椭圆,绘制圆弧还多了三个参数:
//开始角度
startAngle
//扫过角度
sweepAngle
//是否使用中心
useCenter
直接上代码:
RectF rectF = new RectF(100,100,600,600);
// 绘制背景矩形
mPaint.setColor(Color.GRAY);
canvas.drawRect(rectF,mPaint);
// 绘制圆弧(不使用中心点)
mPaint.setColor(Color.BLUE);
canvas.drawArc(rectF,0,90,false,mPaint);
RectF rectF1 = new RectF(100,700,600,1200);
// 绘制背景矩形
mPaint.setColor(Color.GRAY);
canvas.drawRect(rectF1,mPaint);
// 绘制圆弧(使用中心点)
mPaint.setColor(Color.BLUE);
canvas.drawArc(rectF1,0,90,true,mPaint);
四.Paint介绍
如果我们想绘制一个圆,只要边不要里面的颜色怎么办?
很简单,绘制的基本形状由Canvas确定,但绘制出来的颜色,具体效果则由Paint确定。
我们可以给Paint设置style
//设置画笔模式为填充
mPaint.setStyle(Paint.Style.FILL);
Paint.Style | 描述 |
---|---|
STROKE | 描边 |
FILL | 填充 |
FILL_AND_STROKE | 描边加填充 |
参考文章
@GcsSloop:安卓自定义View进阶-Canvas之绘制图形