简介
Canvas我们可以称之为画布,能够在上面绘制各种东西,是安卓平台2D图形绘制的基础。绘制东西,需要4个元素协同来完成:
位图:Bitmap 来保持(hold)那些像素
画布:Canvas 来响应draw的调用
画笔:paint 描述画画的颜色和样式等
绘图基元:矩形、路径、文字、位图等其他元素
Api
drawColor / drawRGB / drawARGB(绘制颜色)
/**
* 使用指定的颜色填充整个画布
*/
public void drawColor(@ColorInt int color)
public void drawRGB(int r, int g, int b)
public void drawARGB(int a, int r, int g, int b)
drawPoint / drawPoints(绘制点)
//绘制单个点
public void drawPoint(float x, float y, @NonNull Paint paint)
public void drawPoints(new float[]{ //绘制一组点,坐标位置由float数组指定
500,500,
500,600,
500,700
},mPaint);
drawLine / drawLines(绘制直线)
// 在坐标(startX,startY)(stopX,stopY)之间绘制一条直线
public void drawLine(float startX, float startY, float stopX, float stopY,Paint paint)
public void drawLines(new float[]{ // 绘制一组线 每四数字(两个点的坐标)确定一条线
100,200,200,200,
100,300,200,300
},mPaint);
drawRect(绘制矩形)
// 左上角和右下角的两个点的坐标
public void drawRect(float left, float top, float right, float bottom,Paint paint);
// Rect精度为int
Rect rect = new Rect(100,100,800,400);
public void drawRect(Rect rect, Paint paint) ;
// Rect精度为float
RectF rectF = new RectF(100,100,800,400);
public void drawRect(RectF rectF, Paint paint);
drawRoundRect(绘制圆角矩形)
//rx,ry是椭圆的两个半径
public void drawRoundRect(RectF rect, float rx, float ry, Paint paint)
drawOval(绘制椭圆)
//绘制椭圆实际上就是绘制一个矩形的内切图形
public void drawOval(RectF oval, Paint paint)
public void drawOval(float left, float top, float right, float bottom, Paint paint)
drawCircle(绘制圆)
// 绘制一个圆心坐标在(cx,cy),半径为radius 的圆。
public void drawCircle(float cx, float cy, float radius, Paint paint)
drawArc(绘制圆弧)
/**
* @param oval 矩形
* @param startAngle 开始角度
* @param sweepAngle 扫过角度
* @param useCenter 是否使用中心,false 圆弧起始点和结束点之间的连线加上圆弧围成的图形
* @param paint The paint used to draw the arc
*/
public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
// 第二种
public void drawArc(float left, float top, float right, float bottom, float startAngle,
float sweepAngle, boolean useCenter, Paint paint)
drawBitmap(绘制图片)
// 第一种
public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)
// 第二种 此处指定的是与坐标原点的距离,并非是与屏幕顶部和左侧的距离
public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)
/**
* 第三种
*
* @param bitmap The bitmap to draw
* @param src 指定绘制图片的区域
* @param dst 指定图片在屏幕上显示(绘制)的区域
*
* 图片宽高会根据指定的区域自动进行缩放。
*
* 将bitmap取下大小为src区域的图片下来,放到dst大小的矩形中显示,取下的图片宽高会根据dst大小自动进行缩放
*/
public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)
drawText(绘制文字)
// x,y 文字开始绘制的启示坐标
public void drawText(String text, float x, float y, Paint paint)
// [start,end)
public void drawText(String text, int start, int end,float x, float y, Paint paint)
画布的操作
相关操作 | 简要介绍 |
---|---|
save | 保存当前画布状态 |
translate | 相对于当前位置位移,而不是每次基于原地(0,0)点移动 |
rotate | 旋转 |
scale | 缩放,canvas.scale(1,-1); // 翻转y坐标轴 |
restore | 回滚到上一次save的状态 |
save(); //保存状态
… //具体操作
restore(); //回滚到之前的状态
canvas.scale(0.5f,0.5f);
canvas.scale(0.5f,0.1f);
调用两次缩放则 x轴实际缩放为0.5x0.5=0.25 y轴实际缩放为0.5x0.1=0.05
canvas.rotate(180);
canvas.rotate(20);
调用两次旋转,则实际的旋转角度为180+20=200度。