版权声明:本文因海牛宝宝童鞋才疏学浅,可能晦涩难懂,但也是呕心沥血之作,麻烦转载的时候留个申明。 https://blog.csdn.net/u012321815/article/details/26018163

        嗯,又是半个月没更新了,由于近期才考完试。事实上这个是月头就做好的项目的一部分。一直没把它写出来,事实上也不难。

       事实上就是绘图,我这里讲两种方式,当然,事实上有非常多方式,我主要是依照做得项目来学习的,事实上我最初考虑是用drawpath的方法来绘图,后来发现给我的数据点足够多,所以就用drawpoint方法,画出来的图显示出来也是像我们看到的那样是连续的一幅。

       首先,谈谈要做成什么效果。由于我要画的是铁轨的轨廓图,已有的是一个标准轨廓的CAD图上取下来的点,是一个txt文件,坐标是一个二维的(x,y)。我要做的就是用这些点,来画出廓形图,当然事实上还有其它的要求。那是项目要求的,和我们说的主题不是非常有关。所以就不说了。

        从这个我们就能够看出来。第一。我们要能把这个txt文件的数据读取出来,最好能依照我们想要的方式读取。其次,我们选用什么方式画,我这里两种我都说。由于我认为都非常easy的操作,主要就是重写一个onDraw()的方法。和实例化一个自己的view来继承view类。然后更新我们的view。

       嗯,首先说下怎么得到我要的点吧。毫无疑问就是读文件操作,可是,我们怎么把这些点获取呢?这里用的就是切割,(split)。取到的点是x,y坐标,中间有一个逗号,利用这个逗号把x,y坐标提取出来。然后提取出来的数据。存在一个Hash表中,这样能够方便我们查找这张表,从而来得到点的坐标。

public void dealFile(String path){
File file = new File(path);//得到文件
String i=null;
if(file.exists()){
try{
FileReader reader = new FileReader(file);
BufferedReader bRreader = new BufferedReader(reader);
String line = null;
while((line = bRreader.readLine()) != null)//读操作
{
a = line.split(",");
idList.add(i);
map = new HashMap<String,Object>();
map.put("x", a[0]);
map.put("y", a[1]);
//map.put("z", a[2]);
listItem.add(map);
}
}catch(Exception e){
}
}

       切割每行。得到两个数据。分别存在了数组a里面,然后把这条记录写进表里面,运行完这个文件操作,就能够得到一个hash表。里面存的就是我们x,y坐标。并且方便我们读取。

       有了这些点,我们要做的就是绘图。

由于我这里取的点密度非常大,所以我能够直接drawpoint方法就能够把这些点作出来。而用户看到的效果却不是单个的点,而是连续的一个弧线。

至于drawpoint方法,首先要做的是写一个继承view的类,显示的时候载入的不是.xml文件,而是这个类的一个实例。而在这个实例中,重写了onDraw这种方法,而drawpoint也就是在这种方法中被调用。

至于drawpoint这方法的參数,有三个,两个是坐标,最后一个是画笔。(paint),画笔是设置这个绘制的属性的,这画点的时候不是非常好理解,假设说画线,线的颜色、粗细等,这都是设置画笔来实现的。当然,我一直忘记说画布(canvas)了。画布的作用就是绘图的画板。你的图是在画布上绘制的,所以重写的onDraw这种方法的传入參数就是这个画布。还有bitmap,这个的概念事实上就是自己定义一个图片,裁剪它得到我们想显示出来的部分。

        直接给出drawpoint方法和drawpath方法代码,非常好理解。

protected void onDraw(Canvas canvas){
super.onDraw(canvas); //设置区域
//canvas.clipRect(0, 300, 720, 800);
canvas.clipRect(0, 200, 480, 500);
canvas.drawColor(Color.BLACK);
canvas.save(); //绘图
mpaint.setAntiAlias(true);
mpaint.setColor(Color.WHITE);
mpaint.setStyle(Paint.Style.STROKE);
mpaint.setStrokeWidth(3);//线宽 //文字显示
String familyName = "宋体";
Typeface font = Typeface.create(familyName, Typeface.BOLD);
pword.setTypeface(font);
pword.setColor(Color.WHITE);
pword.setTextSize(22); //红线
pshowred.setColor(Color.RED);
pshowred.setStyle(Paint.Style.STROKE);
pshowred.setStrokeWidth(3);//线宽 //黄线
pshowyellow.setColor(Color.YELLOW);
pshowyellow.setStyle(Paint.Style.STROKE);
pshowyellow.setStrokeWidth(3);//线宽 //绘图
for (HashMap<String, Object> map : listItem) {
Object objectx = map.get("x");
Object objecty = map.get("y");
float x = Float.parseFloat(objectx.toString());
float y = Float.parseFloat(objecty.toString()); canvas.drawPoint(translate_x(x), translate_y(y), mpaint);
} //固定文字
//canvas.drawText("设计轨廓", 300, 700, pword);
canvas.drawText("设计轨廓", 200, 450, pword);
canvas.drawTextOnPath("非工作边", pathword, 0, 0, pword); //不固定部分
//第一个点
canvas.drawPath(path1r,pshowred);
canvas.drawPath(path1, pshowyellow);
canvas.drawPath(path1y, pshowyellow);
//canvas.drawText("第一", translate_x(13)-30, translate_y(33.0486)-230, pword);
canvas.drawText("第一", translate_x(13)-30, translate_y(33.0486)-130, pword); //第二个点
canvas.drawPath(path2r,pshowred);
canvas.drawPath(path2, pshowyellow);
canvas.drawPath(path2y, pshowyellow);
// canvas.drawText("第二", translate_x(25)-30, translate_y(34.5339)-230, pword);
canvas.drawText("第二", translate_x(25)-30, translate_y(34.5339)-130, pword); //第三个点
canvas.drawPath(path3r,pshowred);
canvas.drawPath(path3, pshowyellow);
canvas.drawPath(path3y, pshowyellow);
//canvas.drawText("第三", translate_x(36.5)-30, translate_y(34.8134)-230, pword);
canvas.drawText("第三", translate_x(36.5)-30, translate_y(34.8134)-130, pword); //第四个点
canvas.drawPath(path4r,pshowred);
canvas.drawPath(path4, pshowyellow);
canvas.drawPath(path4y, pshowyellow);
//canvas.drawText("第四", translate_x(65)-30, translate_y(31.4158)-230, pword);
canvas.drawText("第四", translate_x(65)-30, translate_y(31.4158)-130, pword); }
}

       我这里直接贴出来的是项目里面的代码,不想自己重写一段画点的代码。事实上里面包含了画点、沿路径作图、写字、沿路径写字等等方法。这里面有对坐标进行变换。由于CAD取到的点坐标是实际的坐标。而我们显示在手机上的须要缩放,并且还有对y轴进行取反。

       大致的效果图例如以下。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlzaHVjYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />



画图-drawpoint and drawpath的更多相关文章

  1. Android画图系列(二)——自己定义View绘制基本图形

    这个系列主要是介绍下Android自己定义View和Android画图机制.自己能力有限.假设在介绍过程中有什么错误.欢迎指正 前言 在上一篇Android画图系列(一)--自己定义View基础中我们 ...

  2. Android中利用画图类和线程画出闪烁的心形

                                                        本文讲解主要涉及的知识点: 1.线程控制 2.画图类 3.心形函数 大家先看图片: <ig ...

  3. 【转】C#中Graphics的画图代码

    C#中Graphics的画图代码[转] 架上图片了你就可以在画板上涂改了啊 我要写多几个字上去string str = "Baidu"; //写什么字?Font font = Fo ...

  4. android.graphics(2) - Path, drawPath, moveTo, lineTo, addRect, addCircle, addOval, addArc, drawText, drawTextOnPath

    一.创建路径 canvas中绘制路径利用: void drawPath (Path path, Paint paint) 1.直线路径 void moveTo (float x1, float y1) ...

  5. android.graphics(1) - Paint, Canvas, drawLine, drawPoint, drawRect, drawRoundRect, drawCircle, drawOval, drawArc

    一.Paint与Canvas 像我们平时画图一样,需要两个工具,纸和笔.Paint就是相当于笔,而Canvas就是纸,这里叫画布. 所以,凡有跟要要画的东西的设置相关的,比如大小,粗细,画笔颜色,透明 ...

  6. Android使用Canvas画图

    1.参考:http://blog.csdn.net/rhljiayou/article/details/7212620/ 2.常用方法: 1.Canvas类 drawArc 绘制弧 drawBitma ...

  7. c# GDI画图 双缓冲画图分析

    双缓冲绘图分析  1.Windows 绘图原理  我们在 Windows 环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是“画”出来的.这时的屏幕,就相当于一块黑板,而 Windows ...

  8. Android自己定义View画图实现拖影动画

    前几天在"Android画图之渐隐动画"一文中通过画线实现了渐隐动画,但里面有个问题,画笔较粗(大于1)时线段之间会有裂隙.我又改进了一下.这次效果好多了. 先看效果吧: 然后我们 ...

  9. Ubuntu 16.10 安装KolourPaint 4画图工具

    KolourPaint 4画图工具简单实用,可以绘画.视频处理和图标编辑: • 绘画:绘制图表和“手绘” • 视频处理:编辑截图和照片;应用特效 • 图标编辑:绘画剪贴和标识透明化 1.在Ubuntu ...

随机推荐

  1. php对象序列化总出错false

    php unserialize 返回false的解决方法 php 提供serialize(序列化) 与unserialize(反序列化)方法. 使用serialize序列化后,再使用unseriali ...

  2. MySQL 使用 比较函数 INTERVAL() 函数 实现数据按区间分组

    首先看一下它的定义: INTERVAL(N,N1,N2,N3,..........) INTERVAL()函数进行比较列表(N1,N2,N3等等)中的N值.该函数如果N<N1返回0,如果N< ...

  3. C# 网络打印机ESC指令打印小票

    public void SendSocketMsg(String ip, int port, int times, byte[] data) { try { byte[] mData; ) { mDa ...

  4. python加密包

    利用pycrypto包进行AES.DES.MD5等加密 原文: http://www.cnblogs.com/darkpig/p/5676076.html 第三方Crypto包提供了较全面的加密算法, ...

  5. 微信全局获取并缓存Accesstoken的值

    由于本项目中使用自定义菜单接口.获取用户信息接口.用户分组接口.消息发送接口等,都需要传入一个相同的参数access_token,其有效期 是7200秒(两小时),在有效期内可以使用,一旦access ...

  6. Office Web Apps Server 2013与PDF(一)

    好吧--这个消息有点旧,迟了将近4个月. Office Web Apps是微软各大服务产品系列中的一个基础服务,可以为SharePoint 2013.Exchange 2013.Lync 2013提供 ...

  7. Servlet 表单数据

    很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. GET 方法 GET 方法向页 ...

  8. Eclipse 窗口说明

    Eclipse 窗口说明 Eclipse 工作台(Workbench) 首先,让我们来看一下Eclipse 作台用户界面,和它里面的各种组件. 工作台是多个窗口的集合.每个窗口包含菜单栏,工具栏,快捷 ...

  9. 微信小程序 快键键

    快捷键 格式调整 - Ctrl+S:保存文件 - Ctrl+[, Ctrl+]:代码行缩进 - Ctrl+Shift+[, Ctrl+Shift+]:折叠打开代码块 - Ctrl+C Ctrl+V:复 ...

  10. git分支管理与冲突解决(转载)

    Git 分支管理和冲突解决 原文:http://www.cnblogs.com/mengdd/p/3585038.html 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称 ...