安卓canvas操作的总结
2014.07.03 使用canvas绘图
需求:公司需要绘制波形图,类似数学上的正弦波,一条是参考值,一条是实际曲线
解决方法:采用canvas绘图。保存为图片,以供导出
这里提供一个学习的demo
为了方便调试,看到绘制的效果,因此用canvas 绘制一个视图,放入activity 中。
具体代码如下:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(new CustomView1(this));
}
这里的Customview 是一个自定义的类,继承了view。
它的构造函数必须要传递当前的activity对象或其他容器
public CustomView1(Context context) {
super(context);
}
图片的绘制,具体的细节实现在 该类的ondraw中
@Override
protected void onDraw(Canvas canvas) {
//具体绘图代码
}
有了这些,就算准备好了绘图的大致框架。现在就开始来绘图吧
首先需要一个画笔,同时设置一些参数
paint = new Paint(); // 设置一个笔刷大小是3的黄色的画笔
paint.setColor(Color.BLUE);
// paint.setStrokeJoin(Paint.Join.ROUND); //图像结合的效果 例如平滑
paint.setStrokeCap(Paint.Cap.ROUND); //笔刷的样式 例如圆形 方形等
paint.setStrokeWidth(9);
// paint.setStyle(Paint.Style.STROKE); //设置为空心
paint.setStyle(Paint.Style.FILL); // 设置为实心
然后就是绘制图形,简单的图形,已经有现成的方法,譬如圆形,矩形等
// 绘制圆
canvas.drawCircle(200, 200, 100, paint);
// 绘制弧线区域
RectF rect = new RectF(0, 0, 100, 100);
canvas.drawArc(rect, // 弧线所使用的矩形区域大小
0, // 开始角度
90, // 扫过的角度
true, // 是否使用中心
paint);
// 绘制没有中心的弧线
rect = new RectF(100, 0, 200, 100);
canvas.drawArc(rect, // 弧线所使用的矩形区域大小
0, // 开始角度
90, // 扫过的角度
false, // 是否使用中心
paint);
// 绘制色块。
// canvas.drawColor(Color.BLACK);
// 绘制直线
canvas.drawLine(300, 300, 450, 450, paint);
rect = new RectF(300, 0, 400, 300);
// 矩形区域内切椭圆
canvas.drawOval(rect, paint);
/* 绘制文字 */
/*canvas.drawPosText("Android777", new float[] { 400,
10, // 第一个字母在坐标10,10
410,
20, // 第二个字母在坐标20,20
430,
30, // ....
440, 40, 450, 50, 460, 60, 470, 70, 480, 80, 490, 90, 500,
100 }, paint);
*/
/* 绘制文字 */
//canvas.drawText("吴文付", 500, 150, paint);
/* 画矩形 */
//rect = new RectF(550, 250, 600, 350);
// canvas.drawRect(rect, paint); //直角矩形
// 椭圆矩形
/*canvas.drawRoundRect(rect, 30, // x轴的半径
30, // y轴的半径
paint);
Path path = new Path(); //定义一条路径
path.moveTo(0, 450); //移动到 坐标10,10
path.lineTo(50, 490);
path.lineTo(100,560);
path.lineTo(120, 580);
canvas.drawPath(path, paint);
path = new Path(); //定义一条路径
path.moveTo(100, 500); //移动到 坐标10,10
path.lineTo(50, 600);
path.lineTo(200,660);
path.lineTo(10, 670);
// canvas.drawPath(path, paint);
canvas.drawTextOnPath("吴文付开发者博客", path, 10, 10, paint);
drawSouth(canvas);
如果需要绘制比较复杂的图形,建议通过绘制点来实现或者 路径绘制来实现。
这前提就需要一个算法,提供点的集合。这里就不说了,具体情况具体应用。
一个技巧: 由于工作需要,绘制的线性图,需要填充,但是填充色 与线性图的线 要不同色。
方法是 : 改变画笔的 样式 和颜色,重复画。即可实现。
paint.setStyle(Paint.Style.STROKE);
paint.setStyle(Paint.Style.FILL);

演示的工程地址:http://download.csdn.net/detail/douniwan123654/7586469
安卓canvas操作的总结的更多相关文章
- canvas操作图片,进行面板画图,旋转等
HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript). 不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用 ...
- angular使用canvas操作时报错
最近,用 angular 前端框架为应用登录新增图形验证码认证,由于没有现成的插件,于是便使用canvas+js操作,也是可以正常使用,但是在编译阶段却有个报错: ERROR in src/app/l ...
- 使用Canvas操作像素
现代浏览器支持通过<video>元素播放视频.大多数浏览器也可以通过MediaDevices.getUserMedia() API访问摄像头.但即使这两件事结合起来,我们也无法直接访问和操 ...
- 安卓ListView操作的两种方法
举例做一个微信的中间部分(好友消息等信息通知) 第一种:BaseAdapter() package com.example.wx; import java.util.ArrayList;import ...
- 安卓 canvas
[转]http://blog.sina.com.cn/s/blog_61ef49250100qw9x.html(easy) [转]http://blog.csdn.net/rhljiayou/arti ...
- 微信小游戏canvas操作
这几天在做项目的时候,想在游戏画面之前,在Canvas上面画上一张背景图,代码如下 let ctx = canvas.getContext('2d') export default cl ...
- canvas 操作像素 窗帘效果
代码实例: <!DOCTYPE html> <html> <head> <style> canvas{ background:#eee; } </ ...
- canvas 操作像素 反相
代码实例: <!DOCTYPE html> <html> <head> <style> canvas{ background:#eee; } </ ...
- Winfrom 简单的安卓手机屏幕获取和安卓简单操作
为啥我要做这个东西了,是因为经常要用投影演示app ,现在有很多这样的软件可以把手机界面投到电脑上 ,但都要安装,比如说360的手机助手,我又讨厌安装,于是就自己捣鼓了下 做了这个东西, 实现了以下简 ...
随机推荐
- Mysql笔记5之查询
1查询所有的列 select *from student 2查询指定列 select name,age from student 3查询时候使用别名 select name as 别名,age as ...
- Ubuntu 12.04和Windows 7双系统安装图解
http://wenku.baidu.com/link?url=PZlnNOhY0SjHDW-teFFnCMzPYJVjx7vj6yWY-o5HHFLuFqhLI4uFcQVu_y0_6i7vpSnz ...
- 安装apk时出现错误Failure [INSTALL_FAILED_DEXOPT]问题解决的方法
在android4.0源码里面编译出来apk后,用adb install (或adb install -r 重装)安装时,报错[INSTALL_FAILED_DEXOPT]. xu@xu-PC:~$ ...
- C#入门经典(第三章-1)
#region--------#endregion 此关键字 将设置代码是否可以折叠和展开.但是他们不是C#关键字.注意:带#的是预处理指令,严格说不是C#关键字. 变量:
- 扩展方法实现DevExpress控件校验
DevExpress控件中,如果要控件的值进行校验,需要用到DXValidationProvider控件和DXErrorProvider控件,按照正常思路,无论使用哪个控件要实现校验效果时都需要对每个 ...
- USACO Section 1.1 Broken Necklace 解题报告
题目 题目描述 有一串项链,它是由红蓝白三种颜色的珠子组成的,b代表蓝色,w代表白色,r代表红色,当它完整的时候是一个闭合的环形.现在它在某一个节点断裂了,之前的环形也随之变成了直线形.从两端开始收集 ...
- 数据同步方案(附Java源码)
一.问题背景经常碰到要同步数据的情况,而系统自带的复制功能又不能实现增量同步,每次都要做全量复制,发生异常情况后只能重头再来,非常麻烦,优其是对那种大文件的处理,更是耗时.二.解決方案1.计算源目录数 ...
- html ajax 双引号的问题
"<a onClick='openwin_searchmodel()' href='searchmodel.action?projectname="+person[i].ge ...
- C#读取word文件
第一步:添加对在项目引用里添加上对Microsoft Word 11.0 object library的引用.右击--引用---在com标签下添加.
- Firebug 非常好用
chrome 浏览器 火狐 直接获取网页中传输的数据