注意:Android手机的屏幕的上边位x轴,左边为y轴坐上顶点为原点(0,0)
Canvas Sample 及常用函数
常用方法
- drawARGB / drawRGB / drawColor 使用单一的颜色填充画布。
canvas.drawColor(Color.BLUE);
- drawArc 在一个矩形区域的两个角之间绘制一个弧。
// 参数依次为:弧线所使用的矩形区域大小、开始角度、扫过的角度、是否使用中心
canvas.drawArc(rect, 0, 90, false, paint);
// 参数依次为:弧线所使用的矩形区域大小、开始角度、扫过的角度、是否使用中心
canvas.drawArc(rect, 0, 90, true, paint);
drawBitmap 在画布上绘制一个位图。可以通过指定目标大小或者使用一个矩阵来改变目标位图的外观。
drawBitmapMesh 使用一个mesh(网)来绘制一个位图,它可以通过移动网中的点来操作目标的外观。
- drawCircle 以给定的点为圆心,绘制一个指定半径的圆。
canvas.drawCircle(100, 100, 90, paint);
- drawLine(s) 在两个点之间画一条(多条)直线。
canvas.drawLine(10, 10, 100, 100, paint);
闭合区域的绘制
Paint paint=new Paint();
paint.setColor(Color.RED); //设置画笔颜色
paint.setStyle(Style.STROKE);//填充样式改为描边
paint.setStrokeWidth(5);//设置画笔宽度
Path path = new Path();
path.moveTo(10, 10); //设定起始点
path.lineTo(10, 100);//第一条直线的终点,也是第二条直线的起点
path.lineTo(300, 100);//画第二条直线
path.lineTo(500, 100);//第三条直线
path.close();//闭环
canvas.drawPath(path, paint);
矩形路径
//先创建两个大小一样的路径
//第一个逆向生成
Path CCWRectpath = new Path();
RectF rect1 = new RectF(50, 50, 240, 200);
CCWRectpath.addRect(rect1, Direction.CCW);
//第二个顺向生成
Path CWRectpath = new Path();
RectF rect2 = new RectF(290, 50, 480, 200);
CWRectpath.addRect(rect2, Direction.CW);
//先画出这两个路径
canvas.drawPath(CCWRectpath, paint);
canvas.drawPath(CWRectpath, paint);
//依据路径写出文字
String text="风萧萧兮易水寒,壮士一去兮不复返";
paint.setColor(Color.GRAY);
paint.setTextSize(35);
canvas.drawTextOnPath(text, CCWRectpath, 0, 18, paint);//逆时针生成
canvas.drawTextOnPath(text, CWRectpath, 0, 18, paint);//顺时针生成
drawOval 以指定的矩形为边界,画一个椭圆。
//定义一个矩形区域
RectF oval =newRectF(0,0,200,300);
//矩形区域内切椭圆
canvas.drawOval(oval, paint);
- drawPaint 使用指定的Paint填充整个Canvas
- drawPath 绘制指定的Path。Path对象经常用来保存一个对象中基本图形的集合。
Path path =newPath();//定义一条路径
path.moveTo(10, 10);//移动到 坐标10,10
path.lineTo(50, 60);
path.lineTo(200,80);
path.lineTo(10, 10);
canvas.drawPath(path, paint);
- drawPicture 在指定的矩形中绘制一个Picture对象。
- drawPosText 绘制指定了每一个字符的偏移量的文本字符串。
//按照既定点 绘制文本内容
canvas.drawPosText("Android777",newfloat[]{
10,10,//第一个字母在坐标10,10
20,20,//第二个字母在坐标20,20
30,30,//....
40,40,
50,50,
60,60,
70,70,
80,80,
90,90,
100,100
}, paint);
- drawRect 绘制一个矩形。
RectF rect =newRectF(50, 50, 200, 200);
canvas.drawRect(rect, paint);
- drawRoundRect 绘制一个圆角矩形。
RectF rect =newRectF(50, 50, 200, 200);
canvas.drawRoundRect(rect,
30,//x轴的半径
30,//y轴的半径
paint);
- drawText 在Canvas上绘制一个文本串。文本的字体、大小和渲染属性都设置在用来渲染文本的Paint对象中。如:Paint.setTextSize(Size)
- drawTextOnPath 在一个指定的path上绘制文本。
- drawVertices 绘制一系列三角形面片,通过一系列顶点来指定它们。
- drawPoint
单个点
Paint paint=new Paint(); paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(15);//设置画笔宽度 canvas.drawPoint(100, 100, paint);
Path path =newPath();//定义一条路径
path.moveTo(10, 10);//移动到 坐标10,10
path.lineTo(50, 60);
path.lineTo(200,80);
path.lineTo(10, 10);
canvas.drawTextOnPath("Android777开发者博客", path, 10, 10, paint);
多个点
void drawPoints (float[] pts, Paint paint)
void drawPoints (float[] pts, int offset, int count, Paint paint)
- 1
- 2
Paint paint=new Paint();
paint.setColor(Color.RED); //设置画笔颜色
paint.setStyle(Style.FILL);//设置填充样式
paint.setStrokeWidth(15);//设置画笔宽度
float []pts={10,10,100,100,200,200,400,400};
canvas.drawPoints(pts, 2, 4, paint);
Sample示例:
paint.setAntiAlias(true);
paint.setStyle(Style.STROKE);
canvas.translate(canvas.getWidth()/2, 200);//将位置移动画纸的坐标点:150,150
canvas.drawCircle(0, 0, 100, paint);//画圆圈
//使用path绘制路径文字
canvas.save();
canvas.translate(-75, -75);
Path path =newPath();
path.addArc(newRectF(0,0,150,150), -180, 180);
Paint citePaint =newPaint(paint);
citePaint.setTextSize(14);
citePaint.setStrokeWidth(1);
canvas.drawTextOnPath("http://www.android777.com", path, 28, 0, citePaint);
canvas.restore();
Paint tmpPaint =newPaint(paint);//小刻度画笔对象
tmpPaint.setStrokeWidth(1);
float y=100;
int count = 60;//总刻度数
for(int i=0 ; i <count ; i++){
if(i%5 == 0){
canvas.drawLine(0f, y, 0, y+12f, paint);
canvas.drawText(String.valueOf(i/5+1), -4f, y+25f, tmpPaint);
}else{
canvas.drawLine(0f, y, 0f, y +5f, tmpPaint);
}
canvas.rotate(360/count,0f,0f);//旋转画纸
}
//绘制指针
tmpPaint.setColor(Color.GRAY);
tmpPaint.setStrokeWidth(4);
canvas.drawCircle(0, 0, 7, tmpPaint);
tmpPaint.setStyle(Style.FILL);
tmpPaint.setColor(Color.YELLOW);
canvas.drawCircle(0, 0, 5, tmpPaint);
canvas.drawLine(0, 10, 0, -65, paint);
Canvas 变换
一个Canvas对象有四大基本要素:1、一个用来保存像素的Bitmap2、一个Canvas在Bitmap上进行绘制操作3、绘制的内容4、绘制的画笔PaintCanvas还提供了一系列位置转换的方法:rorate、scale、translate、skew(扭曲)等。这些变换影响的是绘图时相对于承载像素的 bitmap 的相对位置canvas.drawColor(Color.BLUE);
canvas.save();
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
canvas.translate(20, 20);
canvas.drawRect(0, 0, 20, 20, paint);
canvas.restore();
canvas.save();
canvas.translate(60, 0);
canvas.scale(0.5f, 1);
canvas.drawRect(0, 0, 20, 20, paint);
canvas.restore();
canvas.drawRect(0, 0, 20, 20, paint);
Canvas的保存和回滚
为了方便一些转换操作,Canvas还提供了保存和回滚属性的方法(save和restore),比如你可以先保存目前画纸的位置(save),然后旋转90度,向下移动100像素后画一些图形,画完后调用restore方法返回到刚才保存的位置