Android 绘制动态图

最近准备技能大赛,需要将从传感器中读出的数据在移动客户端以图的形式绘制出来,因为平时很少绘图,于是各种查资料,算是勉强做出来了。

以下是大赛理论效果图(左)和实际效果图(右),真的是理想很丰满,现实很骨感啊!

    

 

 制作的整体思路:

  1. 创建一个继承与View类自定义类
  2. 自定义类覆盖其中的onDraw()方法
  3. 在MainActivity中invalidate()方法来调用onDraw()方法来进行图形的重绘.

 

绘制一个基本表:

(注意:代码中使用了变量)

1、绘制矩形

     Paint paint = new Paint();paint.setColor(Color.BLACK);paint.setStyle(Paint.Style.STROKE);Rect chartRec = new Rect(OFFSET_LEFT, OFFSET_TOP, CHARTW + OFFSET_LEFT,CHARTH + OFFSET_TOP);canvas.drawRect(chartRec, paint);

2、绘制左侧数值标记

canvas.drawText("100", OFFSET_LEFT - TEXT_OFFSET - 15, OFFSET_TOP + 5,paint);for (int i = 9; i > 0; i--) {canvas.drawText("" + 10 * (10 - i), OFFSET_LEFT - TEXT_OFFSET - 15,OFFSET_TOP + CHARTH / 10 * i, paint);}canvas.drawText("0", OFFSET_LEFT - TEXT_OFFSET - 10, OFFSET_TOP+ CHARTH, paint);

3、绘制虚线

DashPathEffect是PathEffect类的一个子类,可以使paint画出类似虚线的样子,并且可以任意指定虚实的排列方式。

代码中的float数组,必须是偶数长度,且>=2,指定了多少长度的实线之后再画多少长度的空白.

如本代码中,绘制长度2的实线,再绘制长度2的空白,再绘制长度2的实线,再绘制长度2的空白,依次重复.1是偏移量

 PathEffect effects = new DashPathEffect(new float[] { 2, 2, 2, 2 }, 1);

这样一个基本的表格绘制完成。

 

 

动态改变界面的方法:

Handler handler=new Handler();
Runnable runnable=new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stub//要做的事情handler.postDelayed(this, 1000);} 
};

 在这里我们采用消息传递机制中Handler的postDelayed(Runnable, long) 方法做定时器,每隔一秒钟发送一次Runnable对象(该对象最后将会被封装成Message对象)执行一次子线程中的操作。

 

最后,贴上所有代码:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:id="@+id/root"android:orientation = "vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"></LinearLayout></LinearLayout>

MainActivity.class

public class MainActivity extends Activity {private Handler handler;private DrawTest dtest;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);init();}private void init() {LinearLayout layout = (LinearLayout) findViewById(R.id.root);dtest = new DrawTest(this);dtest.invalidate();layout.addView(dtest);handler = new Handler();handler.post(new Runnable() {@Overridepublic void run() {dtest.invalidate();handler.postDelayed(this, 2000);}});}

}

DrawTest.class

public class DrawTest extends View {private int CHARTH = 600;//表格的高private int CHARTW = 400;//表格的宽private int OFFSET_LEFT = 70;//距离左边界距离private int OFFSET_TOP = 80;//距离右边界距离private int TEXT_OFFSET = 20;//文本距离设置private int X_INTERVAL = 20;//X坐标间隔距离private List<Point> plist;//点集合public DrawTest(Context context) {super(context);plist = new ArrayList<Point>();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawTable(canvas);preparePoint();drawPoint(canvas);}/*** 绘制表* @param canvas*/private void drawTable(Canvas canvas) {Paint paint = new Paint();paint.setColor(Color.BLACK);paint.setStyle(Paint.Style.STROKE);Rect chartRec = new Rect(OFFSET_LEFT, OFFSET_TOP, CHARTW + OFFSET_LEFT,CHARTH + OFFSET_TOP);canvas.drawRect(chartRec, paint);Path textPath = new Path();// 选择一块区域,准备写文字“曲线图测试”
        paint.setStyle(Paint.Style.FILL);textPath.moveTo(200, 30);// 区域开始textPath.lineTo(400, 30);// 区域结束paint.setTextSize(20);paint.setAntiAlias(true);// 指定是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。canvas.drawTextOnPath("曲线图测试", textPath, 0, 0, paint);// 左侧数值标记canvas.drawText("100", OFFSET_LEFT - TEXT_OFFSET - 15, OFFSET_TOP + 5,paint);for (int i = 9; i > 0; i--) {canvas.drawText("" + 10 * (10 - i), OFFSET_LEFT - TEXT_OFFSET - 15,OFFSET_TOP + CHARTH / 10 * i, paint);}canvas.drawText("0", OFFSET_LEFT - TEXT_OFFSET - 10, OFFSET_TOP+ CHARTH, paint);// 绘制虚线Path path = new Path();/*** PathEffect是用来控制绘制轮廓(线条)的方式。* DashPathEffect是PathEffect类的一个子类,可以使paint画出类似虚线的样子,并且可以任意指定虚实的排列方式.* 代码中的float数组,必须是偶数长度,且>=2,指定了多少长度的实线之后再画多少长度的空白.* 如本代码中,绘制长度2的实线,再绘制长度2的空白,再绘制长度2的实线,再绘制长度2的空白,依次重复.1是偏移量,*/PathEffect effects = new DashPathEffect(new float[] { 2, 2, 2, 2 }, 1);paint.setStyle(Paint.Style.STROKE);paint.setAntiAlias(false);paint.setPathEffect(effects);// 用于设置绘制路径时的路径效果,如点划线。for (int i = 1; i < 10; i++) {path.moveTo(OFFSET_LEFT, OFFSET_TOP + CHARTH / 10 * i);path.lineTo(OFFSET_LEFT + CHARTW, OFFSET_TOP + CHARTH / 10 * i);canvas.drawPath(path, paint);}}/*** 准备绘制点*/private void preparePoint() {//设置点的Y坐标为30-40int py = (CHARTH/10)*6+OFFSET_TOP + (int) Math.rint((Math.random() * (CHARTH/10)));Point p = new Point(OFFSET_LEFT + CHARTW, py);if (plist.size() > 21) {plist.remove(0);//控制点的个数//改变每一个点的X坐标for (int i = 0; i < 20; i++) {if (i == 0)plist.get(i).x -= (X_INTERVAL - 2);elseplist.get(i).x -= X_INTERVAL;}plist.add(p);} else {for (int i = 0; i < plist.size() - 1; i++) {plist.get(i).x -= X_INTERVAL;}plist.add(p);}}/*** 绘制点* * @param canvas*/private void drawPoint(Canvas canvas) {Paint paint = new Paint();paint.setColor(Color.BLACK);paint.setStrokeWidth(3);// 设置笔触的宽度if (plist.size() >= 2) {for (int i = 0; i < plist.size() - 1; i++) {canvas.drawPoint(plist.get(i).x, plist.get(i).y, paint);}}}
}

 【注:invalidate ()和postInvalidate()方法的选择:文档中已经写的很清楚了,如果要使用invalidate()必须要在UI主线程当中,如果不在UI主线程中,就要去调用postInValidate()】

如果大家有什么更好的方法或该文中有什么不足,希望大家指点。

Demo下载http://download.csdn.net/detail/af74776/7440807

转载于:https://www.cnblogs.com/scetopcsa/p/3765719.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外 谷歌 app api_Google App Engine Java功能和命名空间API

海外 谷歌 app api功能API 使用Capabilities API&#xff0c;您的应用程序可以检测特定API功能的停机和计划停机时间。 您可以使用此API来检测应用程序何时不可用&#xff0c;然后绕过它来减少应用程序的停机时间。 我们该如何处理呢&#xff1f; 1.优雅&#xff1a;创建一个…

$(document).ready() 和 window.onload 方法比较

说明 页面加载文档完毕后&#xff0c;浏览器会通过 Javascript 为 DOM 元素添加事件。 Javascript 使用 window.onload 方法&#xff0c;而 jQuery 使用 $(document).ready() 方法。 $(document).ready() 方法可以极大的提高 Web 应用程序的相应速度&#xff0c;因为该方法可以…

python在excel中查找内容_用python实现excel中查找指定字符的行信息

标签&#xff1a;print python实现 run div col with open value row 信息用python实现excel中查找指定字符的行信息strr # 字符串 or 字符filename # 文件名路径with open(filename,‘r‘) as fp:for line in fp:if strr in line:print (line.rows)将会输出ex…

使用活动记录执行CRUD

本文是我们学院课程的一部分&#xff0c;标题为jOOQ –类型安全的数据库查询 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多&#xff0c;JDBC过多时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特…

java undo_用JAVA实现Undo、Redo,Copy、Paste、Cut_java

programlover原作package clipborad;import javax.swing.JTextArea;import java.awt.datatransfer.*;import java.awt.*;import javax.swing.*;import java.io.*;import javax.swing.undo.*;http://www.gaodaima.com/64851.html用JAVA实现Undo、Redo,Copy、Paste、Cut_javaimpo…

项目管理控件Project Management Library

Project Management Library是一款项目管理控件&#xff0c;包含了项目管理相关的Windows客户端控件,如&#xff1a;ProjectView, ResourcesView, ScheduleView, StatisticsView。支持所有.NET语言&#xff0c;可以用于Windows桌面应用程序,具有标准的界面和操作自定义设置、拖…

maven aspectj_使用Spring AspectJ和Maven进行面向方面的编程

maven aspectjSpring框架附带AOP支持。 实际上&#xff0c;如Spring参考文档中所述 &#xff0c; “ Spring的关键组件之一是AOP框架。 尽管Spring IoC容器不依赖于AOP&#xff0c;这意味着您不需要使用AOP&#xff0c;但AOP是对Spring IoC的补充&#xff0c;以提供一种功能强…

ios 查询mysql数据库操作系统_iOS数据库FMDB--增删改查(模糊查询)详细介绍

简介&#xff1a;很早就想整理一下数据库的使用了&#xff0c;刚好最近接触较多&#xff0c;加之可以安排出空余的时间&#xff0c;所以瓜子我贡献出自己喝咖啡的时间整理一下FMDB的使用&#xff0c;以下是对FMDB的介绍以及基本使用 --- insert、delete、update、select。其中s…

java arraylist 重复_Java中ArrayList去除重复元素

Java中ArrayList去除重复元素//删除ArrayList中重复元素public static void removeDuplicate(ArrayList list) {for ( int i 0 ; i for ( int j list.size() - 1 ; j > i; j -- ) {ForCytoLevel3 jjj (ForCytoLevel3)list.get(j);ForCytoLevel3 i…

c#时间转换

转自 http://blog.csdn.net/yysyangyangyangshan/article/details/6782874最近做ASP.NET的一个项目&#xff0c;获取时间的时候&#xff0c;由于我的系统时间设置了上午和下午&#xff0c;结果DateTime.Now老是写不到数据库中&#xff0c;然后&#xff0c;上网查了个[csharp]vi…

SQL Server 2008 R2如何生成带数据的数据库脚本

1.对想要复制的数据库右键&#xff0c;“任务”&#xff0c;“生成脚本” 2.下面需要注意的是&#xff0c;默认情况下&#xff0c;只会生成仅架构的脚本&#xff0c;也就是说仅仅有表结构&#xff0c;而没有数据的空壳。所以需要额外的设置。 在设置脚本编写选项&#xff0c;选…

java saxreader_JAVA解析XML,SAXReader无法使用

写了段代码要解析XML文件。for (int p 0; p < files.length; p) {System.out.println("Dom4jxml2:333::"p);if (files[p].isFile() && files[p].getName().startsWith("CN_MT1101_")) {File f new File(files[p].getPath());System.out.print…

methodhandle_概览Java 7 MethodHandle及其用法

methodhandle由于Java的Reflection API&#xff0c;我们已经能够在运行时检查和更改程序执行。 特别是&#xff0c;我们可以在运行时观察接口/类/方法和字段&#xff0c;而无需在编译时知道它们的名称。 JDK 7为这种动态/运行时检查引入了一个新的参与者&#xff0c;即方法句柄…

quartz CronExpression表达式

一个cron表达式有至少6个&#xff08;也可能7个&#xff09;有空格分隔的时间元素。按顺序依次为1.秒&#xff08;0~59&#xff09;2.分钟&#xff08;0~59&#xff09;3.小时&#xff08;0~23&#xff09;4.天&#xff08;月&#xff09;&#xff08;0~31&#xff0c;但是你需…

java两个字符串前缀_java – 找到两个字符串的最长公共前缀

我想找到两个字符串的最长公共前缀.有没有办法循环我的最后几个if语句,以便我可以结束彼此不匹配的最后几个字符&#xff1f;System.out.println("Enter the first string: ");String s input.nextLine();System.out.println("Enter the second string: "…

Codeforces 427 D. Match amp; Catch

后缀数组.... 在两个串中唯一出现的最小公共子串 D. Match & Catchtime limit per test1 secondmemory limit per test512 megabytesinputstandard inputoutputstandard outputPolice headquarter is monitoring signal on different frequency levels. They have got two …

gwt 同步和异步_GWT Spring和Hibernate进入数据网格世界

gwt 同步和异步利用Infinispan Data Grid的功能最大化Hibernate性能。 一个GWT &#xff0c; Spring &#xff0c; JPA &#xff0c; Hibernate &#xff0c; Infinispan集成教程。 在本教程中&#xff0c;我们将讨论如何将Infinispan用作Hibernate二级缓存提供程序。 Infinis…

java分页 jar_零基础学java之javaEE,分页

【分页】一 分页1.1分页概念引入什么是分页?分页(英语&#xff1a;Paging)&#xff0c;是一种操作系统里存储器管理的一种技术&#xff0c;可以使电脑的主存可以使用存储在辅助存储器中的数据。操作系统会将辅助存储器(通常是磁盘)中的数据分区成固定大小的区块&#xff0c;称…

查看修改MySQL字符集

查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) 转载▼标签&#xff1a; 字符集 mysql数据库 mysql字符集查看 mysql启动命令 修改mysql字符集 分类&#xff1a; 网站开发MySQL字符集多种多样…

java上传文件需要的依赖_SpringBoot使用commons-fileupload上传文件的类

网上找了一些&#xff0c;都是基本介绍&#xff0c;没有直接就可以使用类&#xff0c;在实际工作当中都有适合当前项目的上传文件的方法&#xff0c;本人写了一个类&#xff0c;比较基础&#xff0c;但呆以满足项目的上传文件功能&#xff0c;使用了commons-fileupload这个组件…