android UI——2D绘图绘制几何图形
2016-05-15 19:55
501 查看
如果在看这篇博文的程序员对于2d绘制的基础和细节不够了解的话,建议先看看我的另一篇博客:android UI——2D绘图中应该注意的那些坑
想要绘制图形,必不可少的需要获得Canvas实例。
不管是自定义view还是bitmap,都需要Canvas,Paint和Path来实现绘制。
以上代码相当于初始化了一个画家和一只画笔。而对象Canvas内部已经指向了一个画布bitmap之类的实例。
接下来是各种几何图形的绘制。其中的参数绝大部分是坐标,而坐标在这里是没有负数的。
以上就是大部分的几何图形的绘制。绘图在ui上的用处可谓点睛之笔,有时候的确很方便。
还有画家(Canvas)的一些属性设置:
更多Canvas属性可以查看android api:Android 官方api Canvas
画笔(Paint)的一些属性设置:
更多Canvas属性可以查看android api:Android 官方api Paint
绘图路径(Path)的一些属性:
最后还有画布(RectF)的属性:
更多Canvas属性可以查看android api:Android 官方api RectF
想要绘制图形,必不可少的需要获得Canvas实例。
不管是自定义view还是bitmap,都需要Canvas,Paint和Path来实现绘制。
//使用canvas绘图 private void initDraw(Canvas canvas) { //画布移动到具体的坐标(x,y)位置上,这里指左上角的初始位置 canvas.translate(10, 10); //画布使用白色填充 canvas.drawColor(Color.WHITE); /** * 创建画笔,这里如果传入颜色,实际显示中是无法显示颜色的,我没有细究其原因。 * 错误: * Paint paint = new Paint(Color.RED); * 正确: * Paint paint = new Paint(); * paint.setColor(Color.RED); * */ Paint paint = new Paint(); //设置颜色 paint.setColor(Color.RED); /** * 设置画笔的锯齿效果 * 提示:无圆角的图形去掉锯齿;有圆角的例如圆角矩形需要添加锯齿 * */ paint.setAntiAlias(true); }
以上代码相当于初始化了一个画家和一只画笔。而对象Canvas内部已经指向了一个画布bitmap之类的实例。
接下来是各种几何图形的绘制。其中的参数绝大部分是坐标,而坐标在这里是没有负数的。
// 画文本。1,文本;2、3,起始x,y坐标;4,画笔 canvas.drawText("画圆:", 10, 10, paint); /** * drawCircle 看看官方api的解释:使用指定的油漆画指定的圆。如果半径是< = 0,那么什么都不会。圆填充或框架基于绘画的风格。 * cx 中心的坐标x * cy 中心的坐标y * radius 半径 * paint 使用的画笔 * */ canvas.drawCircle(60, 20, 10, paint);//圆
canvas.drawText("画线:", 10, 60, paint); /** * drawLine 看看官方api的解释:画一条线段与指定的启动和停止x,y坐标,使用指定的油漆。 * 注意,因为一条线总是“陷害”,油漆的样式设置将被忽略。 * 退化(长度为0行)将不会画。 * * 参数我也就不解释了:drawLine (float startX, float startY, float stopX, float stopY, Paint paint) * */ canvas.drawLine(60, 40, 100, 40, paint);// 画线 canvas.drawLine(110, 40, 190, 80, paint);// 斜线
canvas.drawText("画弧线:", 10, 80, paint); //画弧线 paint.setStyle(Paint.Style.STROKE);//设置空心 RectF rectFOval = new RectF(150, 20, 180, 40);//RectF表示一个矩形,参数是四个角的坐标 /** * drawArc 看看官方api的解释:绘制指定的弧,将缩放以适合在指定的椭圆形。如果一开始角是- > = 360,360年初角被视为开始角模。 如果扫描角> = 360,那么椭圆完全被吸引。注意,这个SkPath略有不同:arcTo,将扫描角模360。如果扫描角是负的,扫描角作为扫描角模360 电弧是顺时针方向。一个角度0度对应的几何角度0度(3点钟看。) 参数: oval 椭圆形的范围用于定义弧的形状和大小 startAngle 起始角(度)弧开始 sweepAngle sweepangle扫描角(度)测量 useCenter 如果这是真的,包括椭圆的弧的中心,并关闭它,如果它被抚摸。这将画一个楔子。也就是说如果设置成了true,则这个图形不是一条弧线了,而会是类似于扇形 paint 油漆 * */ canvas.drawArc(rectFOval, 180, 180, false, paint);//小弧形
canvas.drawText("画矩形:", 10, 100, paint); paint.setStyle(Paint.Style.FILL);//设置填满 /** * drawRect 看看官方api的解释:绘制指定的矩形使用指定的油漆。矩形将油漆或框架基于风格。 * 参数就不解释了:(float left, float top, float right, float bottom, Paint paint)皆为坐标 * */ canvas.drawRect(60, 60, 80, 80, paint);// 正方形 canvas.drawRect(60, 90, 160, 100, paint);// 长方形
canvas.drawText("画扇形和椭圆:", 10, 120, paint); RectF oval2 = new RectF(60, 100, 200, 240);// 设置个新的长方形,扫描测量 // 画扇形,第一个参数是RectF:该类是第二个参数是角度的开始,第三个参数是多少度,第四个参数是真的时候画扇形,是假的时候画弧线 canvas.drawArc(oval2, 200, 130, true, paint); //oval改一下 oval2.set(210, 100, 250, 130); //椭圆形:使用指定的油漆画指定的椭圆形。总统将油漆或框架基于风格。 canvas.drawOval(oval2, paint);
canvas.drawText("画三角形:", 10, 200, paint); // 绘制这个三角形,你可以绘制任意多边形 Path path1 = new Path(); path1.moveTo(80, 200);// 此点为多边形的起点,设置下一个轮廓的开始点(x,y)。 path1.lineTo(120, 250);//添加一行从最后一点到指定点(x,y)。如果没有调用moveTo()方法,则默认起点为(0,0) path1.lineTo(80, 250); path1.close(); // 使这些点构成封闭的多边形 /** * 使用指定的油漆画指定的路径。这将不会是一条 *填满或框架基于绘画的风格。 * */ canvas.drawPath(path1, paint);
// 你可以绘制很多任意多边形,比如下面画六连形 paint.reset();//重置 paint.setStyle(Paint.Style.STROKE);//设置空心 Path path2 = new Path(); path2.moveTo(180, 200); path2.lineTo(200, 200); path2.lineTo(210, 210); path2.lineTo(200, 220); path2.lineTo(180, 220); path2.lineTo(170, 210); path2.close();//封闭 canvas.drawPath(path2, paint);
//画圆角矩形 paint.setStyle(Paint.Style.FILL);//充满 paint.setAntiAlias(true);// 设置画笔的锯齿效果 canvas.drawText("画圆角矩形:", 10, 260, paint); RectF oval3 = new RectF(80, 260, 200, 300);// 设置个新的长方形 /** * 使用指定的油漆画指定的圆角的绘制 * */ canvas.drawRoundRect(oval3, 20, 15, paint);//第二个参数是x半径,第三个参数是y半径
//画贝塞尔曲线 canvas.drawText("画贝塞尔曲线:", 10, 310, paint); paint.reset(); paint.setStyle(Paint.Style.STROKE);//中空 Path path3 = new Path(); path3.moveTo(100, 320);//设置Path的起点 path3.quadTo(150, 310, 170, 400); //设置贝塞尔曲线的控制点坐标和终点坐标;添加一个二次贝塞尔曲线的接近控制点,最后一点; canvas.drawPath(path3, paint);//画出贝塞尔曲线
//画点 paint.setStyle(Paint.Style.FILL); canvas.drawText("画点:", 10, 390, paint); canvas.drawPoint(60, 390, paint);//画一个点 canvas.drawPoints(new float[]{60, 400, 65, 400, 70, 400}, paint);//画多个点,假设你想画整个数组
//画图片,就是贴图在画板上 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.abc_ic_ab_back_mtrl_am_alpha); canvas.drawBitmap(bitmap, 250, 360, paint);
以上就是大部分的几何图形的绘制。绘图在ui上的用处可谓点睛之笔,有时候的确很方便。
还有画家(Canvas)的一些属性设置:
//为Paint设置渐变器 Shader mShader = new LinearGradient(0, 0, 40, 60, new int[]{ Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW}, null, Shader.TileMode.REPEAT); //为Paint设置渐变器 paint.setShader(mShader);
更多Canvas属性可以查看android api:Android 官方api Canvas
画笔(Paint)的一些属性设置:
paint.setStyle(Paint.Style.STROKE);//设置画笔风格为描边 paint.setShadowLayer(45, 10, 10, Color.GRAY);//设置阴影 paint.setColor(Color.RED);//画笔的颜色 paint.setStrokeWidth(1);//画笔的宽度
更多Canvas属性可以查看android api:Android 官方api Paint
绘图路径(Path)的一些属性:
path1.moveTo(80, 200);// 此点为多边形的起点,设置下一个轮廓的开始点(x,y)。 path1.lineTo(120, 250);//添加一行从最后一点到指定点(x,y)。如果没有调用moveTo()方法,则默认起点为(0,0) path1.close(); // 使这些点构成封闭的多边形 path3.quadTo(150, 310, 170, 400); //设置贝塞尔曲线的控制点坐标和终点坐标;添加一个二次贝塞尔曲线的接近控制点,最后一点;
最后还有画布(RectF)的属性:
RectF oval = new RectF(80, 260, 200, 300);// 设置个新的矩形
更多Canvas属性可以查看android api:Android 官方api RectF
相关文章推荐
- 给UILabel 或者 UIButton标题加下划线
- 在spark中使用Hive报错error: not found: value sqlContext
- JSP内置对象--request对象
- iOS开发系列--UITableView全面解析
- 按钮添加活动指示器
- 关于hibernate中的错误:Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: tb_e
- poj 1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- 国防科大校赛决赛-final(镜像赛) Problem A: XueXX and P-P String
- 国防科大校赛决赛-final(镜像赛) Problem C: XueXX and Chessboard
- 国防科大校赛决赛-final(镜像赛) Problem B: XueXX and Binary
- Burp Suite使用详解
- 使用 Equinox 开发 OSGi 应用程序
- poj 1458 Common Subsequence
- 【LeetCode】95. Unique Binary Search Trees II
- Java源码学习 -- java.lang.StringBuilder,java.lang.StringBuffer,java.lang.AbstractStringBuilder
- php中include()和require()的区别
- LeetCode 60. Permutation Sequence
- 在Android Studio中进行单元测试和UI
- 【GIT】使用GIT GUI 连接到conding码库教程