重要的类自定义View组件要重写View组件的onDraw(Canvase)方法,接下来是在该 Canvas上绘制大量的几何图形,点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形,等各种形状!
DrawView.java
[java]  view plain copy

 
  1. public class DrawView extends View {
  2. public DrawView(Context context) {
  3. super(context);
  4. }
  5. @Override
  6. protected void onDraw(Canvas canvas) {
  7. super.onDraw(canvas);
  8. /*
  9. * 方法 说明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawPath 绘制任意多边形
  10. * drawLine 绘制直线 drawPoin 绘制点
  11. */
  12. // 创建画笔
  13. Paint p = new Paint();
  14. p.setColor(Color.RED);// 设置红色
  15. canvas.drawText("画圆:", 10, 20, p);// 画文本
  16. canvas.drawCircle(60, 20, 10, p);// 小圆
  17. p.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了
  18. canvas.drawCircle(120, 20, 20, p);// 大圆
  19. canvas.drawText("画线及弧线:", 10, 60, p);
  20. p.setColor(Color.GREEN);// 设置绿色
  21. canvas.drawLine(60, 40, 100, 40, p);// 画线
  22. canvas.drawLine(110, 40, 190, 80, p);// 斜线
  23. //画笑脸弧线
  24. p.setStyle(Paint.Style.STROKE);//设置空心
  25. RectF oval1=new RectF(150,20,180,40);
  26. canvas.drawArc(oval1, 180, 180, false, p);//小弧形
  27. oval1.set(190, 20, 220, 40);
  28. canvas.drawArc(oval1, 180, 180, false, p);//小弧形
  29. oval1.set(160, 30, 210, 60);
  30. canvas.drawArc(oval1, 0, 180, false, p);//小弧形
  31. canvas.drawText("画矩形:", 10, 80, p);
  32. p.setColor(Color.GRAY);// 设置灰色
  33. p.setStyle(Paint.Style.FILL);//设置填满
  34. canvas.drawRect(60, 60, 80, 80, p);// 正方形
  35. canvas.drawRect(60, 90, 160, 100, p);// 长方形
  36. canvas.drawText("画扇形和椭圆:", 10, 120, p);
  37. /* 设置渐变色 这个正方形的颜色是改变的 */
  38. Shader mShader = new LinearGradient(0, 0, 100, 100,
  39. new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW,
  40. Color.LTGRAY }, null, Shader.TileMode.REPEAT); // 一个材质,打造出一个线性梯度沿著一条线。
  41. p.setShader(mShader);
  42. // p.setColor(Color.BLUE);
  43. RectF oval2 = new RectF(60, 100, 200, 240);// 设置个新的长方形,扫描测量
  44. canvas.drawArc(oval2, 200, 130, true, p);
  45. // 画弧,第一个参数是RectF:该类是第二个参数是角度的开始,第三个参数是多少度,第四个参数是真的时候画扇形,是假的时候画弧线
  46. //画椭圆,把oval改一下
  47. oval2.set(210,100,250,130);
  48. canvas.drawOval(oval2, p);
  49. canvas.drawText("画三角形:", 10, 200, p);
  50. // 绘制这个三角形,你可以绘制任意多边形
  51. Path path = new Path();
  52. path.moveTo(80, 200);// 此点为多边形的起点
  53. path.lineTo(120, 250);
  54. path.lineTo(80, 250);
  55. path.close(); // 使这些点构成封闭的多边形
  56. canvas.drawPath(path, p);
  57. // 你可以绘制很多任意多边形,比如下面画六连形
  58. p.reset();//重置
  59. p.setColor(Color.LTGRAY);
  60. p.setStyle(Paint.Style.STROKE);//设置空心
  61. Path path1=new Path();
  62. path1.moveTo(180, 200);
  63. path1.lineTo(200, 200);
  64. path1.lineTo(210, 210);
  65. path1.lineTo(200, 220);
  66. path1.lineTo(180, 220);
  67. path1.lineTo(170, 210);
  68. path1.close();//封闭
  69. canvas.drawPath(path1, p);
  70. /*
  71. * Path类封装复合(多轮廓几何图形的路径
  72. * 由直线段*、二次曲线,和三次方曲线,也可画以油画。drawPath(路径、油漆),要么已填充的或抚摸
  73. * (基于油漆的风格),或者可以用于剪断或画画的文本在路径。
  74. */
  75. //画圆角矩形
  76. p.setStyle(Paint.Style.FILL);//充满
  77. p.setColor(Color.LTGRAY);
  78. p.setAntiAlias(true);// 设置画笔的锯齿效果
  79. canvas.drawText("画圆角矩形:", 10, 260, p);
  80. RectF oval3 = new RectF(80, 260, 200, 300);// 设置个新的长方形
  81. canvas.drawRoundRect(oval3, 20, 15, p);//第二个参数是x半径,第三个参数是y半径
  82. //画贝塞尔曲线
  83. canvas.drawText("画贝塞尔曲线:", 10, 310, p);
  84. p.reset();
  85. p.setStyle(Paint.Style.STROKE);
  86. p.setColor(Color.GREEN);
  87. Path path2=new Path();
  88. path2.moveTo(100, 320);//设置Path的起点
  89. path2.quadTo(150, 310, 170, 400); //设置贝塞尔曲线的控制点坐标和终点坐标
  90. canvas.drawPath(path2, p);//画出贝塞尔曲线
  91. //画点
  92. p.setStyle(Paint.Style.FILL);
  93. canvas.drawText("画点:", 10, 390, p);
  94. canvas.drawPoint(60, 390, p);//画一个点
  95. canvas.drawPoints(new float[]{60,400,65,400,70,400}, p);//画多个点
  96. //画图片,就是贴图
  97. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
  98. canvas.drawBitmap(bitmap, 250,360, p);
  99. }
  100. }

Canvas上绘制几何图形的更多相关文章

  1. 软件项目技术点(7)——在canvas上绘制自定义图形

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...

  2. 在<canvas>上绘制img(drawImage())时需要注意的事

    <canvas>标签相当于是一个画布,css决定画布的样式(这块画布的背景颜色.大小等),脚本(一般使用JavaScript)就是画笔,我们可以在这个画布上绘制线条.形状.文字.图片等. ...

  3. Android 如何将Canvas上绘制的内容保存成本地图片(转)

    效果如下图所示 保存在sd卡上的文件为 手机上显示效果为: 1>>在Manifest文件中增加相应权限 <!-- 在SDCard中创建与删除文件权限 --> <uses- ...

  4. 前端使用html2canvas截图,在canvas上绘制图片及保存图片

    1.使用html2canvas 存在的问题: 不同的机型绘制位置不同的问题. 这个主要因为Html动态设置了html的dpr.(dpr可以解决屏幕显示不了1pxborder和无法显示小于12px的文字 ...

  5. 软件项目技术点(5)——在canvas上绘制动态网格线

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 grid类的实现 当鼠标在画布上缩放时,网格能跟着我的鼠标滚动而相应的有放大缩小的效果. 下面是具体实现的代码,draw函数里计算出大 ...

  6. HTML5实现绘制几何图形

    HTML5新增了一个<canvas.../>属性.该元素自身并不绘制图形,只是相当于一张空画布.如果开发者需要向<canvas.../>上绘制图形则必须使用JavaScript ...

  7. Android中使用SurfaceView和Canvas来绘制动画

    事实上每一个View中都有Canvas能够用来绘制动画.仅仅须要在这个View中重载onDraw()方法就能够,可是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做&quo ...

  8. -_-#【Canvas】导出在<canvas>元素上绘制的图像

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. HTML5<canvas>标签:使用canvas元素在网页上绘制线条和圆(1)

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

随机推荐

  1. ACM高精度加减乘除模板

    [转]#include <iostream> #include <string> using namespace std; inline int compare(string ...

  2. c++中的对象引用(object reference)与对象指针的区别

    ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需 ...

  3. 异常语句:try(尝试)-catch(抓取)-finally 跳转语句:break

    跳转语句: 1.break:跳出的意思,如果在循环语句中使用则是跳出循环2.default,--默认语句通常与 switch case 配合使用3.continue--跳过一个,继续下一个继续retu ...

  4. BZOJ 1925: [Sdoi2010]地精部落( dp )

    dp(i,j)表示1~i的排列中, 以1~j为开头且开头是下降的合法方案数 这种数列具有对称性, 即对于一个满足题意且开头是上升的n的排列{an}, 令bn = n-an+1, 那么{bn}就是一个满 ...

  5. Group DataList

    一,效果图. 二,源代码. <!DOCTYPE html><html><head> <meta charset="UTF-8"> & ...

  6. ZOJ 3607 Lazier Salesgirl 贪心

    这个题比上个题简单得多,也是超过W时间会睡着,睡着就再也不会卖了,顾客按时间顺序来的,但是可能有顾客同时到(同时到如果醒着就全卖了),并且每个人只买一块面包,也是求最大的W,使得卖出面包的平均价格最高 ...

  7. POJ 3528 求三维凸包表面积

    也是用模板直接套的题目诶 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include < ...

  8. ORACLE存储过程笔记1

    ORACLE存储过程笔记1 一.基本语法(以及与informix的比较)   create [or replace] procedure procedure_name (varible {IN|OUT ...

  9. mybatis-redis项目分析

    redis作为现在最优秀的key-value数据库,非常适合提供项目的缓存服务.把redis作为mybatis的查询缓存也是很常见的做法.在网上发现N多人是自己做的Cache,其实在mybatis的g ...

  10. ios中的任务分段

    工作比较忙,蛮久没有写东西了,今天我要写的是ios中的任务分段.大多数的情况下,我们用不到任务分段,但是如果我们是在执行比较频繁的函数或者这个函数是比较耗时, 某一条件下,我要执行新的任务,并且取消上 ...