概述:

我们时常会遇到一些需要利用画图来实现的功能。例如一些常见的几何图形——点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形,总不能遇到 一个几何图形就用图片来代替吧。这样我们的手机肯定会吃不消。就算我们现在能够使用一些少量图片能够来解决当前的一些问题,可是对于那些“变化多端”的需求来说,这些手段根本不值一提。对此,我们可以利用Canvas画图技术来解决。下面就让我们一起来解开Canvas的神秘面纱吧。

示例编程:

1.绘制圆形

首先看一下效果图展示:

实现关键代码:

private void drawCirle(Canvas canvas) {canvas.drawCircle(500, 500, 200, paint);}

2.绘制弧线区域

效果图展示:

实现关键代码:

private void drawCuttingCirle(Canvas canvas) {RectF rect = new RectF(0, 0, 400, 400);canvas.drawArc(rect, // 弧线所使用的矩形区域大小0, // 开始角度90, // 扫过的角度false, // 是否使用中心paint);}

3.绘制1/4圆

效果图展示:

实现关键代码:

private void drawQuarterCirle(Canvas canvas) {RectF rect = new RectF(0, 0, 300, 300);canvas.drawArc(rect, // 弧线所使用的矩形区域大小0, // 开始角度90, // 扫过的角度true, // 是否使用中心paint);}

4.绘制直线

效果图展示:

实现关键代码:

private void drawLine(Canvas canvas) {canvas.drawLine(10, 10, 800, 1000, paint);}

5.绘制椭圆

效果图展示:

实现关键代码:

private void drawOval(Canvas canvas) {// 定义一个矩形区域RectF oval = new RectF(10, 5, 600, 900);// 矩形区域内切椭圆canvas.drawOval(oval, paint);}

6.绘制矩形

效果图展示:

实现关键代码:

private void drawRect(Canvas canvas) {RectF rect = new RectF(50, 50, 200, 200);canvas.drawRect(rect, paint);}

7.绘制圆角矩形

效果图展示:

实现关键代码:

private void drawSmoothRect(Canvas canvas) {RectF rect = new RectF(50, 50, 200, 200);canvas.drawRoundRect(rect, 30, // x轴的半径30, // y轴的半径paint);}

8.绘制多边形

效果图展示:

实现关键代码:

private void drawPolygon(Canvas canvas) {Path path = new Path(); // 定义一条路径path.moveTo(10, 10); // 移动到 坐标10,10path.lineTo(150, 1360);path.lineTo(960, 720);path.lineTo(500, 180);path.lineTo(10, 10);canvas.drawPath(path, paint);}

9.绘制罗盘

效果图展示:

实现关键代码:

private void drawCompass(Canvas canvas) {paint.setAntiAlias(true);paint.setStyle(Style.STROKE);canvas.translate(canvas.getWidth() / 2, 500); // 平移罗盘canvas.drawCircle(0, 0, 200, paint); // 画圆圈// 使用path绘制路径文字canvas.save();canvas.translate(-155, -155);Path path = new Path();path.addArc(new RectF(0, 0, 300, 300), -180, 180);Paint citePaint = new Paint(paint);citePaint.setTextSize(30);citePaint.setStrokeWidth(1);canvas.drawTextOnPath("http://blog.csdn.net/lemon_tree", path, 35, 0, citePaint);canvas.restore();Paint tmpPaint = new Paint(paint); // 小刻度画笔对象tmpPaint.setStrokeWidth(2);tmpPaint.setTextSize(30);float y = 200;int count = 60; // 总刻度数for (int i = 0; i < count; i++) {if (i % 5 == 0) {canvas.drawLine(0f, y, 0, y + 20f, paint);canvas.drawText(String.valueOf(i / 5 + 1), -4f, y + 55f, tmpPaint);} else {canvas.drawLine(0f, y, 0f, y + 15f, tmpPaint);}canvas.rotate(360 / count, 0f, 0f); // 旋转画纸}// 绘制指针tmpPaint.setColor(Color.GRAY);tmpPaint.setStrokeWidth(4);canvas.drawCircle(0, 0, 20, tmpPaint);tmpPaint.setStyle(Style.FILL);tmpPaint.setColor(Color.YELLOW);canvas.drawCircle(0, 0, 5, tmpPaint);canvas.drawLine(0, 30, 0, -135, paint);}

以上的代码中,我不知道大家看上去会不会感觉有一点乱,不过没关系,在下一篇博客中我会对这一块单独拿出来说一下。以自定义一个动态时钟为例详细说明这部分的内容,大家稍安勿躁。大家可以参看《Android UI编程进阶——使用SurfaceViewt和Canvas实现动态时钟》进行学习。

10.记录手指运动的路径

效果图展示:

实现关键代码:

这一部分的功能实现主要就是考虑三个部分:记录路径(这里单独拿一个变量来保存的原因是因为画图的时候会有一个重绘的过程,也就需要擦除后重绘,如果不保存以前的路径,这样就可能导致以前的路径不见了)、记录事件、绘制。

获得记录的路径:

private ArrayList<PointF> graphics = new ArrayList<PointF>();

触摸事件:

public boolean onTouchEvent(MotionEvent event) {graphics.add(new PointF(event.getX(), event.getY()));invalidate(); // 重新绘制区域return true;}

绘制:

private void drawFingerPath(Canvas canvas) {for (PointF point : graphics) {canvas.drawPoint(point.x, point.y, paint);}}

源码下载:

(注:源码中除了Canvas使用集合的示范外还有画曲线、正/余弦函数、SurfaceView的使用、心跳。PS:心跳示例需要点击屏幕才能触发)

http://download.csdn.net/detail/u013761665/8423823

Android自定义控件前导基础知识学习(一)——Canvas相关推荐

  1. uniapp 基础知识学习

    uniapp 基础知识学习 uniapp 基础知识学习 [uniapp 介绍](https://uniapp.dcloud.io/README) 有哪些uni-app的作品 uni-app的社区规模 ...

  2. echarts结合react开发基础知识学习

    echarts基础知识学习 1.echarts简介 ECharts,一个使用 JavaScript 实现的开源可视化库,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,S ...

  3. Android技能树 — 树基础知识小结(一)

    前言: 现在安卓面试,对于数据结构的问题也越来越多了,也经常看到别人发的面试题都是问什么红黑树,二叉树查找等,所以我们虽然不会马上就会各种难的面试题,但起码树的基础知识还是要会的,这样才能去进一步学. ...

  4. 计算机二级二叉树基础知识,2017年计算机二级公共基础知识学习教程:树与二叉树...

    (六)树与二叉树 1.树的基本概念 树是一种简单的非线性结构.在树结构中,数据元素之间有着明显的层次结构.在树的图形表示中,用直线连接两端的结点,上端点为前件,下端点为后件. 在树结构中,每一个结点只 ...

  5. Python 基础知识学习笔记——NumPy

    Python基础知识学习笔记--NumPy 与 matlab 优秀的矩阵运算类似,python 提供了 numpy 库,这对熟悉 matlab 的用户来说非常友好.向量.矩阵和多维数组是数值计算中必不 ...

  6. Python 基础知识学习笔记——OpenCV(1)

    Python 基础知识学习笔记--OpenCV(1) OpenCV是一个开源的跨平台计算机视觉和机器学习软件库,它轻量而且高效,被广泛的使用. 整理一下OpenCV学习笔记,以防忘记. 文章目录 Py ...

  7. Python基础知识学习笔记——Matplotlib绘图

    Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...

  8. python基础知识学习笔记(2)

    python基础知识学习笔记(2) 整理一下python基础知识,以防忘记 文章目录 python基础知识学习笔记(2) python简洁的一行代码 python简洁的一行代码 1.交换两个变量 # ...

  9. python基础知识学习笔记(1)

    python 基础知识学习笔记(1) 总结一下Python基础知识,以防忘记. 文章目录 python 基础知识学习笔记(1) 一.起步 1.python安装与编译环境 二.变量和简单数据类型 三.列 ...

最新文章

  1. 腾讯音乐招 iOS 开发, base 深圳,要求:本科、三年、OC,懂音视频开发优先。...
  2. Android数据库新王者-Realm入门教程
  3. java 中required_通过实例学习Spring @Required注释原理
  4. 《数据库系统实训》实验报告——触发器
  5. 向anna学习系统结构和测试流程
  6. OWASP-ZAP扫描器的使用(攻击)
  7. HDU 2689 POJ 2299 树状数组 + 离散化
  8. QQ邮箱鸡肋存储型XSS漏洞利用
  9. iOS下微信语音播放之切换听筒和扬声器的方法解决方案
  10. 推荐-最新1000多个单机游戏下载,不用注册直接下载!(3)
  11. oracle中cube的作用,Oraclerollup和cube分析
  12. 无线路由器连接有线路由器设置
  13. Chartboost大中华区开发者关系经理刘欣允:如何设计,以增加游戏内收入
  14. MySQL 在线一键安装
  15. 一个文本回射C/S程序并讨论:fork、信号处理机制、僵死进程处理
  16. 数据分析统计学原理第十二章:多个比例的比较、独立性及拟合优度检验 | 我的统计学原理复习日记
  17. 机器学习——从线性回归到逻辑回归【附详细推导和代码】
  18. SLAM前端知识汇总
  19. 计算机专业技能比赛方案,计网系第二届计算机技能比赛方案
  20. 我所收藏的重点大学BBS资源

热门文章

  1. C++ Primer 5th笔记(8)chapter8 类:IO库-流的状态
  2. [NCTF2019]Reverse
  3. Mysql数据库五大常用数据引擎
  4. BabyXor flower逆向寒假生涯(19/100)
  5. 008 释放技能call分析
  6. 【 Laravel 】日 常 整 理 记 录 分 享
  7. 【运维】linux硬盘空间不足,扩容硬盘,挂载目录,并永久挂载
  8. Codeforces Round #515 (Div. 3)【未完结】
  9. 力扣: 231. 2的幂 【位运算】
  10. 项目: 用封装的方法实现飞机大战游戏