Android Paint,Canvas api 详解
来源:互联网 发布:松下plc编程手册 编辑:程序博客网 时间:2024/06/08 04:33
概述
我们通过在画布上绘画进行类比,如下:
Canvas:相当于画布,Bitmap提供内存,绘的画会保存在Bitmap中。
Paint:相当于画笔。
有了画笔和画笔我们就可以绘画了。
Paint 类常用方法
设置颜色
/** * 参数一:Android内部定义的有Color类包含了一些常见颜色定义 * Color.RED 或者 getResources().getColor(android.R.color.holo_blue_bright) * 或者Color.rgb(255,100,100)或者Color.argb(50,255,100,100) */paint.setColor(int color) // 设置颜色/** * 参数一:alpha透明值 */paint.setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色
设置不透明度
paint.setAlpha(int a) // 设置alpha不透明度,范围为0~255
设置是否抗锯齿
paint.setAntiAlias(boolean aa) // 是否抗锯齿
设置文本缩放倍数
/** * 参数一:,1.0f为原始 */paint.setTextScaleX(float scaleX) // 设置文本缩放倍数
设置字体大小
paint.setTextSize(float textSize) // 设置字体大小
设置下划线
paint.setUnderlineText(booleanunderlineText) // 设置下划线
设置实心还是空心
/** * 实心 * /paint.setStyle(Paint.Style.FILL);/** * 空心 * /paint.setStyle(Paint.Style.STROKE);
设置画笔的粗细
paint.setStrokeWidth(10);
关键点:以上Paint的操作作用在下次绘画的画笔上
Canvas 常用方法
Canvas平移、缩放、旋转、画布的错切
关键点:Canvas平移、缩放、旋转操作作用在下次绘画的画布上
Canvas平移
/** * 画布向(100,50)方向平移 * * 参数1: 向X轴方向移动100距离 * 参数2: 向Y轴方向移动50距离 */ canvas.translate(100, 50);
Canvas缩放
/** * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍 * 参数1: X轴的放大倍数 * 参数2: Y轴的放大倍数 */ canvas.scale(2, 4); /** * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍 * 参数1: X轴的放大倍数 * 参数2: Y轴的放大倍数 * 参数3: 原点在X坐标位置 * 参数4: 原点在Y坐标位置 */ canvas.scale(2, 4,100,100);
Canvas旋转
/** * 原点为中心,旋转30度(顺时针方向为正方向 ) * 参数: 旋转角度 */canvas.rotate(30);/** * 以(100,100)为中心,旋转30度,顺时针方向为正方向 * 参数: 旋转角度 */ canvas.rotate(30,100,100);
Canvas画布的错切
/** * 参数1:将画布在x方向上倾斜相应的角度,倾斜角度的tan值 * 参数2:将画布在y方向上倾斜相应的角度,倾斜角度的tan值canvas.skew(1,0);
实例
@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint p = new Paint(); p.setColor(Color.argb(50,255,100,100)); canvas.drawRect(0,0,200,200,p); // 以原始Canvas画出一个矩形1 canvas.translate(300,300); // 将Canvas平移(300,300) p.setColor(Color.argb(50,100,255,100)); canvas.drawRect(0,0,200,200,p); // 矩形2 canvas.rotate(30); // 将Canvas旋转30 p.setColor(Color.argb(50,100,0,255)); canvas.drawRect(0,0,200,200,p); // 矩形3 canvas.scale(2, 2); // 将Canvas以原点为中心,放大两倍 p.setColor(Color.argb(50,255,255,0)); canvas.drawRect(0,0,200,200,p); // 矩形4 // x 方向上倾斜45 度 canvas.skew(1, 0); p.setColor(0x8800ff00); canvas.drawRect(new Rect(0, 0, 200, 200), p); // 矩形5 // Y 方向上倾斜45 度 canvas.skew(0, 1); p.setColor(Color.argb(60,201,81,205)); canvas.drawRect(new Rect(0, 0, 200, 200), p); // 矩形6}
Canvas保存和还原
Canvas提供了几个方法,让我们可以方便的对Canvas的状态进行更改和还原。
这些方法是:save()
、restore()
、restoreToCount(int saveCount)
。
我们在对Canvas进行平移、旋转、放大等操作时候,可以调用save()
方法,将当前修改过的Canvas状态进行保存,调用restore()
方法后,会将Canvas还原成最近的一个save()
的状态。 save()
方法还会有一个返回值,我们也可以调用restoreToCount(int saveCount)
方法,将这个返回值作为参数传递进去,就可以将Canvas还原成某一个特定的save()
状态。
canvas.translate(100,100); // 平移(100,100)int save1 = canvas.save(); // 保存Canvas状态(状态1)canvas.scale(2, 2); // 放大2倍int save2 = canvas.save(); // 保存Canvas状态(状态2)canvas.restore(); // 返回最新的save状态,即状态2canvas.restoreToCount(save1); // 手动指定的返回到 状态1
画图
画文字
/** * 参数2:默认是这个字符串的开始在屏幕的x轴位置,如果设置了paint.setTextAlign(Paint.Align.CENTER);那就是字符的中心距屏幕的x轴位置 * 参数2:这个字符baseline在屏幕上的y轴位置 * 参数3:画笔对象 */canvas.drawText("开始写字了!",50, 50, p);// 画文本/** * 参数2:要从第几个字开始绘制 * 参数3:要绘制到第几个文字 * 参数4:默认是这个字符串的开始在屏幕的x轴位置,如果设置了paint.setTextAlign(Paint.Align.CENTER);那就是字符的中心距屏幕的x轴位置 * 参数5:这个字符baseline在屏幕上的y轴位置 * 参数6:画笔对象 */canvas.drawText("开始写字了!",2,5, 50, 50, p);// 画文本,结果为:“写字了”/** * 参数2:路径 * 参数3:距离路径开始位置的偏移量 * 参数4:距离路径上下的偏移量(可以为负数) * 参数5:画笔对象 */canvas.drawTextOnPath("1234567890101123123", path, 0, -50, p);
点击详细了解字符的baseline基线
画圆
/** * 参数1:圆心X * 参数2:圆心Y * 参数3:半径R * 参数4:画笔对象 */ canvas.drawCircle(200, 200, 100, p);
画线
/** * 参数1:startX * 参数2:startY * 参数3:stopX * 参数4:stopY * 参数5:画笔对象 */canvas.drawLine(100, 100, 300, 300, p);// 画线/** * 同时绘制多条线。 * 参数1:float数组:每四个一组为一条线。最后不足四个,就忽略那些值。 * 参数2:画笔对象 */canvas.drawLines(new float[]{100,100,200,200,200,100,300,100}, p);
画椭圆
/* * RectF:表示坐标系中的一块矩形区域,并可以对其做一些简单操作。 * 这块矩形区域,需要用左上和右下两个坐标点表示。 * 参数1:float left * 参数2:float top * 参数3:float right * 参数4:float bottom */RectF oval = new RectF(150, 200, 500, 400); canvas.drawOval(oval, p); // 画一个椭圆
画弧度
/** * 画圆弧 * 参数1:RectF对象。 表示坐标系中的一块矩形区域,并可以对其做一些简单操作。 * 这块矩形区域,需要用左上和右下两个坐标点表示。 * 参数2:开始的角度。(水平向右为0度顺时针反向为正方向) * 参数3:扫过的角度。(水平向右为0度顺时针方向为正方向) * 参数4:是否和中心连线 * 参数5:画笔对象 */canvas.drawArc(oval, 20, 180, false, p);
矩形
/** * 矩形 * 参数1:float left * 参数2:float top * 参数3:float right * 参数4:float bottom */canvas.drawRect(100, 100, 200, 200, p);//画圆角矩形RectF oval3 = new RectF(80, 260, 200, 300); // 设置个新的长方形canvas.drawRoundRect(oval3, 20, 5, p); // 第二个参数是x半径,第三个参数是y半径
多边形
/** * Path类封装复合(多轮廓几何图形的路径 * 由直线段*、二次曲线,和三次方曲线,也可画以油画。drawPath(路径、油漆),要么已填充的或抚摸 * (基于油漆的风格),或者可以用于剪断或画画的文本在路径。 */Path path = new Path(); // 路径对象 path.moveTo(80, 200); // 此点为多边形的起点 path.lineTo(120, 250); path.lineTo(80, 250); //.... 可以添加多个点。构成多边形 path.close(); // 使终点和起点链接,构成封闭图形 canvas.drawPath(path, p);
画贝塞尔曲线
p.setStyle(Style.STROKE);Path path2=new Path();path2.moveTo(100, 100); //设置Path的起点/** * 参数1、2:x1,y1为控制点的坐标值 * 参数3、4:x2,y2为终点的坐标值 */path2.quadTo(300, 100, 400, 400); // 设置贝塞尔曲线的控制点坐标和终点坐标path2.quadTo(500, 700, 800, 800);canvas.drawPath(path2, p); //画出贝塞尔曲线
画点
/** * 参数1、2:点的x、y坐标 */canvas.drawPoint(60, 390, p); // 画一个点/** * 参数1:多个点,每两个值为一个点。最后个数不够两个的值,忽略。 */canvas.drawPoints(new float[]{60,400,65,400,70,400}, p); // 画多个点
画图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);/** * 参数1:bitmap对象 * 参数2:图像左边坐标点 * 参数3:图像上边坐标点 */canvas.drawBitmap(bitmap, 200,300, p);
实例
@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); /* * 方法 说明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawPath 绘制任意多边形 * drawLine 绘制直线 drawPoin 绘制点 */ // 创建画笔 Paint p = new Paint(); p.setColor(Color.BLACK); // 设置文字为黑色 p.setTextSize(40); // 设置画笔粗细(即字体大小) // 画实心圆 canvas.drawText("画实心圆", 5, 100, p); // 画文本 canvas.drawCircle(220, 80, 50, p); // 画空心圆 p.setStyle(Paint.Style.STROKE); // 空心 canvas.drawText("画空心圆", 280, 100, p); // 画文本 canvas.drawCircle(500, 80, 50, p); // 画实心锯齿圆 p.setStyle(Paint.Style.FILL); // 实心 canvas.drawText("画实心抗锯齿圆", 5, 200, p); // 画文本 p.setAntiAlias(true); // 设置画笔的抗锯齿效果 canvas.drawCircle(340, 180, 50, p);// 大圆 // 画线 canvas.drawText("画字符的baseline基线-fg", 5, 300, p); canvas.drawLine(5,300,600,300,p); // 画椭圆 canvas.drawText("画实心椭圆", 5, 400, p); RectF rectF = new RectF(210, 310, 600, 450); canvas.drawOval(rectF,p); // 画空心椭圆 p.setStyle(Paint.Style.STROKE); canvas.drawText("画空心椭圆", 610, 400, p); RectF rectF1 = new RectF(820, 310, 1050, 450); canvas.drawOval(rectF1,p); // 画空心弧度 canvas.drawText("画空心弧度",5,500,p); p.setColor(Color.rgb(165,114,170)); RectF rectF2 = new RectF(210, 410, 600, 550); canvas.drawArc(rectF2, -30, 240, true, p); // 画实心方角矩形 p.setColor(Color.BLACK); canvas.drawText("画实心方角矩形",5,600,p); p.setStyle(Paint.Style.FILL); p.setColor(Color.rgb(165,114,170)); canvas.drawRect(290,560,600,630,p); // 画实心圆角矩形 p.setColor(Color.BLACK); canvas.drawText("画实心圆角矩形",5,700,p); p.setStyle(Paint.Style.FILL); p.setColor(Color.rgb(165,114,170)); RectF rectF3 = new RectF(290,660,600,730); canvas.drawRoundRect(rectF3,20,20,p); // 画空心多边形 p.setColor(Color.BLACK); canvas.drawText("画空心多边形", 5, 800, p); p.setStyle(Paint.Style.STROKE); //设置空心 Path path = new Path(); // 路径对象 path.moveTo(300, 740); path.lineTo(400, 740); path.lineTo(460, 780); path.lineTo(400, 820); path.lineTo(300, 820); path.lineTo(250, 780); path.close(); // 封闭 canvas.drawPath(path, p); // 画实心贝塞尔曲线 p.setColor(Color.BLACK); canvas.drawText("画实心贝塞尔曲线", 5, 900, p); p.setStyle(Paint.Style.FILL); Path path1=new Path(); path1.moveTo(330, 830); // 设置Path的起点 path1.quadTo(500, 980, 900, 1000); // 设置贝塞尔曲线的控制点坐标和终点坐标 canvas.drawPath(path1, p); // 画出贝塞尔曲线 // 画一个点 canvas.drawText("画一个点", 5, 1100, p); p.setColor(Color.RED); p.setStrokeWidth(10); // 设置画笔的粗细 canvas.drawPoint(180, 1100, p); // 画一个点 // 画多个点 p.setColor(Color.BLACK); canvas.drawText("画多个点", 5, 1200, p); p.setColor(Color.RED); p.setStrokeWidth(20); canvas.drawPoints(new float[]{180, 1200, 220,1200, 260, 1200}, p); // 画一个点 // 画图片 p.setColor(Color.BLACK); canvas.drawText("画图片", 5, 1300, p); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); canvas.drawBitmap(bitmap, 120,1210, p);}
Demo效果图
源码点击此处下载
阅读全文
0 0
- Android Paint,Canvas api 详解
- Android API解析Paint&Canvas
- Android Path, Region, Paint, Canvas API篇
- Android 2D绘图(Canvas+paint)详解
- Android API学习之画布Canvas、颜料Paint
- android bitmap,canvas,paint常用方法API,总结
- Android自定义控件绘制流程与Paint, Canvas相关API
- android canvas paint
- Android Canvas和Paint
- Android Canvas Path Paint
- android 中的 canvas , paint
- android: Canvas,Paint,Path
- Android绘图Canvas、Paint
- 53.Android Canvas Paint
- Android基础-canvas paint
- Android Canvas,Paint 绘图
- android 中 Canvas和Paint
- android 中 Canvas和Paint
- @javax.annotation.Resource的使用以及和@Autowired的区别
- Spring注入中byType和byName的总结
- 通信原理--知识要点
- Android studio 打包混淆报错总结(第一节)
- Selenium2+Python2.0自动化测试【3】 元素定位
- Android Paint,Canvas api 详解
- Spring事务管理(详解+实例)
- ZOJ2112-Dynamic Rankings(树状数组套主席树)
- Shell Sort
- MPAndroidChart项目实战(七)——自定义横向柱状图
- 串口通讯回顾
- ArcMap Add-in插件开发中解决VS调试时断点不会命中的问题
- 机器学习校招笔记1:bootstrap
- 洛谷 2341 受欢迎的牛