先来看一下Canvas

Canvas 用来提供draw方法的调用。绘制东西需要4个基本的组建:一个bitmap用来存放像素,一个canvas用来提供draw方法的调用(往bitmap里写入),原始绘制元素(e.g.Rect, Path, text,Bitmap), 一个paint。
看一下canvas的主要方法:

  • canvas.save()保存canvas的状态,保存之后,可以调用canvas的平移、缩放、旋转、错切、裁剪等操作。
  • canvas.restore();恢复canvas之前保存的状态。
  • canvas.translate(x,y);移动坐标原点到指定位置。
  • canvas.drawArc();绘制圆弧。
  • canvas.drawText();绘制文本。
  • canvas.drawLine();绘制线段。
  • canvas.drawRect();绘制矩形。

    Paint类

    Paint 类提供绘制几何图形,文本,和位图 所需要的样式和颜色信息。
    paint的主要方法:

  • paint.setAntiAlias()抗锯齿。

  • paint.setStrokeWidth() 设置画笔的宽度。
  • paint.setStyle()设置空心。
  • paint.setDither()设置防抖动。
    ### HappinessView.java
public class HappinessView extends View {private static final float CIRCLE_RADIUS = 100f;private static final float faceRadiusToEyeRadiusRadio = 10f;private static final float faceRadiusToEyeOffsetRadio = 3f;private static final float faceRadiusToEyeSeparationRadio = 1.5f;private static final float faceRadiusToMouthWidthRadio = 1;private static final float faceRadiusToMouthHeightRadio = 3;private static final float faceRadiusToMouthOffsetRatio = 3;private enum Eye{ Left, Right}public HappinessView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setStyle(Paint.Style.STROKE);paint.setAntiAlias(true);paint.setColor(Color.BLUE);canvas.drawCircle(100, 100, CIRCLE_RADIUS, paint);circlePathForEye(canvas, paint, Eye.Left);circlePathForEye(canvas, paint, Eye.Right);bezierPathForSmile(canvas, paint);}private void bezierPathForSmile(Canvas canvas, Paint paint) {float fractionOfMaxSmile = -1f;float mouthWidth = CIRCLE_RADIUS / faceRadiusToMouthWidthRadio;float mouthHeight = CIRCLE_RADIUS / faceRadiusToMouthHeightRadio;float mouthVerticalOffset = CIRCLE_RADIUS / faceRadiusToMouthOffsetRatio;float smileHeight = Math.max(Math.min(fractionOfMaxSmile, 1), -1) * mouthHeight;float startPointX = 100 - mouthWidth / 2;float startPointY = 100 + mouthVerticalOffset;float endPointX = startPointX + mouthWidth;float endPointY = startPointY;float point1X = startPointX + mouthWidth / 3;float point1Y = startPointY + smileHeight;float point2X = endPointX - mouthWidth / 3;float point2Y = point1Y;Path path = new Path();path.moveTo(startPointX, startPointY);path.cubicTo( point1X, point1Y, point2X, point2Y, endPointX, endPointY);canvas.drawPath(path, paint);}private void circlePathForEye(Canvas canvas, Paint paint, Eye eye){float eyeRadius = 100 / faceRadiusToEyeRadiusRadio;float eyeVerticalOffset = 100 / faceRadiusToEyeOffsetRadio;float eyeHorizontalSeparation = 100 / faceRadiusToEyeSeparationRadio;float eyeY = 100 - eyeVerticalOffset;float eyeX = 100;switch (eye) {case Left:eyeX = eyeX - eyeHorizontalSeparation / 2;break;case Right:eyeX = eyeX + eyeHorizontalSeparation / 2;break;}canvas.drawCircle(eyeX, eyeY, eyeRadius, paint);}
}

一个简单的笑脸图形。

绘制基础知识-canvas paint相关推荐

  1. C#的图形绘制基础知识

     图形绘制基础 在Windows的用户界面中,当创建一个窗口,并在该窗口进行绘图时,一般要声明一个派生于System.Windows.Forms.Form的类.如果要编写一个定制控件,就要声明一个 ...

  2. 嵌入式--基于AD15的原理图及PCB绘制基础知识

    一.新建空白工程模板 1.新建项目    2.新建库->原理图库   3.新建原理图 4.新建库->库->PCB元件库    5.新建PCB    6.四个新建分别保存 如果单独打开 ...

  3. 19、综合布线系统施工图绘制基础知识

    正文:

  4. Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识

    基础知识 canvas 元素可以说是HTML5元素中最强大的一个,他真正的能力是通过canvas的context对象表现出来的.该环境对象可以从canvas元素身上获得. <body>&l ...

  5. html5 canvas绘制图形,html5 Canvas绘制图形入门详解

    html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...

  6. 好程序员分享24个canvas基础知识小结

    好程序员分享24个canvas基础知识小结,非常全面详尽,推荐给大家. 现把canvas的知识点总结如下,以便随时查阅. 1.填充矩形 fillRect(x,y,width,height); 2.绘制 ...

  7. canvas在舞台上点击后图片旋转_View绘制系列(10)Canvas基础变换

    Canvas基础变换 前面学习了Canvas相关的一些绘制方法,不知道大家发现没?我们都是根据左上角(0,0)点算出来新的坐标,然后再绘制,这样明显不符合我们平常基于坐标原点绘制的习惯,那么我们能不能 ...

  8. 好程序员分享24个canvas基础知识小结 1

    好程序员分享24个canvas基础知识小结,非常全面详尽,推荐给大家. 现把canvas的知识点总结如下,以便随时查阅. 1.填充矩形 fillRect(x,y,width,height); 2.绘制 ...

  9. 自定义控件之Canvas图形绘制基础练习-青春痘笑脸^_^

    对于自定义控件的意义不言而喻,所以对它的深入研究是很有必要的,前些年写过几篇关于UI效果的学习过程,但是中途比较懒一直就停滞了,而对于实际工作还是面试来说系统深入的了解自定义控件那是很有必要的,所以接 ...

最新文章

  1. android 判断时间是否过期_眉笔眉粉有保质期吗?怎么判断眉笔眉粉是否过期?...
  2. opencv cv2.LUT()(使用查找表中的值填充输出数组)
  3. go io.reader 多次读取_Go 经典入门系列 24:Select
  4. 牛赞:音视频前端跨平台技术应用
  5. android 绘图软件,安卓最强大的绘图软件 妙笔生花最新评测
  6. apex英雄机器人探路者怎么玩_Apex英雄探路者机器人实战技巧攻略[多图]
  7. x-scan mysql_X-Scan使用教程
  8. 错误org.hibernate.InvalidMappingException: Unable to read XML解决方法
  9. Ubuntu 16.04安装SoapUI工具进行接口测试(Web Service/WSDL/RESTfull)
  10. c语言贪吃蛇实训报告文档,C语言实现贪吃蛇.docx
  11. VBA-Excel重心法求解最优地址
  12. 计算机视觉大型攻略 —— 立体视觉(4)立体匹配算法简介与SGM
  13. 使用 OpenSSL 创建ssl自签名证书
  14. 重装系统后小喇叭显示未安装音频输出设备
  15. springboot内嵌tomcat如何优雅开启http端口
  16. 字节、腾讯、金山wps、跟谁学、百度 go工程师面试题集锦
  17. 作为开发者你必须要知道的五大浏览器,记得收藏
  18. Anbox 编译和Anbox Docker 下编译运行
  19. 【JS】js判断等号、等同(===、==)
  20. Cassini Data Rev manufacturer eals Likely Subsurface Ocean on Titan

热门文章

  1. C++虚继承中构造函数和析构函数顺序问题以及原理
  2. Cow Contest——Floyed+连通性判断
  3. 【Verilog HDL】第四章 模块的端口连接规则——污水处理模型
  4. Java高级进阶学习资料!java开发环境的搭建是什么意思
  5. 系统学Android从零开始,搞懂这些直接来阿里入职
  6. PostgreSQL 安装 用户配置
  7. js进阶 12-5 jquery中表单事件如何使用
  8. (第2篇)一篇文章教你轻松安装hadoop
  9. 使用flot.js 发现x轴y轴无法显示轴名称
  10. 在windows storage server 2008上创建iscsi磁盘