热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现动态体温计

这篇文章主要为大家详细介绍了Android实现动态体温计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android实现动态体温计的具体代码,供大家参考,具体内容如下

前段时间在做一个生理参数采集的项目,其中涉及到体温模块。这是我的部分总结。
实现内容: 从文件中读取体温数据,动态绘制体温的效果。即体温数据随时间在不停的变化。体温计绘制效果为立体效果。

实现原理:

1、体温计的绘制

绘制原理:

体温计的大体框架由图1,2,4,5,6,7构成,绘制通过自定义View,DrawView的onDraw()方法来实现,体温计水银柱的的绘制通过SurfaceView来实现。根据屏幕宽度来设定体温计大小及位置。

图1,2,6构成体温计玻璃管,由颜色Color.argb(255, 25, 25, 112)和颜色Color.argb(250, 65,105,225)从左往右一次填充,实现渐变。图3是动态矩形,为体温计水银柱,由Color.RED和Color.argb(250, 255, 255, 0)有下往上填充,实现红色到橙色的渐变。图8为体温计水银柱头部,用红色填充。图4,5组合形成光晕,图4由Color.argb(30, 250, 250, 250)填充,图5填充颜色与体温计玻璃管相同。先绘制图4再绘制图5,于是,便形成月牙形光晕。图7为光晕,由Color.argb(30, 250, 250, 250)填充。然后画出刻度线,这样便制作出具有立体感的体温计。感觉底座部分设计的不大好,立体感不强。

动态刷新原理:将从文件中的体温数据读取,存储到数组当中,绘制体温时,根据数据来确定中间红色水银柱的坐标,其实,也就是动态矩形的绘制,采用定时绘制的方法实现动态效果。

原理说的差不多了,我们来看下代码实现过程:

布局文件:textView用来显示数值,surfaceView用来绘制动态矩形。

temp.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 

  
  

  

   
  

  

  

  

  

体温计绘制View代码段:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.DisplayMetrics;
import android.view.View;

public class DrawTemp extends View{


 private float wide;
 private float high;
 private float t_wide;
 private float t_high ;
 private float r; //半径大小
 private float x0;//圆心坐标
 private float x1;
 private float y0;
 private float y1;
 /*自定义颜色*/
 private int color_blue = Color.argb(255, 25, 25, 112);
 private int color_bule1 = Color.argb(250, 65,105,225);
 private int color_white = Color.argb(30, 250, 250, 250);
 private int color_white1 = Color.argb(60, 250, 250, 250);
 private int color_orange = Color.argb(250, 255, 255, 0);
 public DrawTemp(Context context) {
  super(context);
  // TODO 自动生成的构造函数存根
   Paint paint = new Paint();
   paint.setColor(Color.YELLOW);
 }

  protected void onDraw(Canvas canvas)
  {
   DisplayMetrics dm = new DisplayMetrics(); 
   dm = getResources().getDisplayMetrics();
  wide = dm.widthPixels; // 屏幕宽(像素,如:480px) 
 high = dm.heightPixels; // 屏幕高(像素,如:800px)
   t_wide = wide/20;
   t_high = high/20;
   r = t_high-10;
   x0 = wide/2+2*t_wide;
   x1 = wide/2+4*t_wide;
   y0 = t_high*2;
   y1 = 10*t_high;

   float ydegree = 9*t_high; 
   int min_temp = 35; //最低温度为35
   int m1 = 4;
   int Line1_size = 1;
    int Line2_size = 3;
    int Line3_size = 5;
   //设置最小大刻度线条参数
   Paint paintLine1 = new Paint(); 
   paintLine1.setColor(Color.BLUE); 
   paintLine1.setStrokeWidth(Line3_size);
   //设置中等刻度线条参数
   Paint paintLine2 = new Paint(); 
   paintLine2.setColor(Color.YELLOW); 
   paintLine2.setStrokeWidth(Line2_size);
   //设置最小刻度线条参数
   Paint paintLine3 = new Paint(); 
   paintLine3.setColor(Color.GREEN); 
   paintLine3.setStrokeWidth(Line1_size);
   //设置文字参数
   Paint text = new Paint();
   text.setColor(Color.MAGENTA);
   text.setTextSize(30);

   Paint mPaint = new Paint(); 
   mPaint.setStrokeWidth(m1);
   LinearGradient ng= new LinearGradient(x0-10, y0, x1-10, y0, color_blue,color_bule1, Shader.TileMode.CLAMP);
   mPaint.setShader(ng);
   canvas.drawRect(x0-10, y0, x1+10, y1, mPaint);//绘制外围矩形
   canvas.drawCircle(x0+t_wide, y0, t_wide+10,mPaint );//绘制外围上部分圆弧
   canvas.drawCircle(x0+t_wide, y1,r+10, mPaint);//绘制外围底座


   //绘制水银柱
   Paint nPaint = new Paint();
   nPaint.setColor(Color.RED);
   canvas.drawCircle(x0+t_wide, y1, r-10, nPaint); 
   //LinearGradient mg= new LinearGradient(x0+10, y1, x0-10, y0, Color.RED,color_orange, Shader.TileMode.CLAMP);
   LinearGradient mg= new LinearGradient(x0+10, y1, x1-10, y0, Color.RED,color_orange, Shader.TileMode.CLAMP); 
   nPaint.setShader(mg);

   //绘制动态矩形
   // canvas.drawRect(x0+10, y, x1-10, y1, nPaint);

   //绘制光晕,圆角矩形
   Paint paint = new Paint();
   paint.setColor(color_white);
   RectF Rect = new RectF(x0-5, y0,x0+5, y1-t_high);

   canvas.drawCircle(x0+t_wide, y0-t_wide/2-t_wide/3, t_wide/3,paint );
   canvas.drawCircle(x0+t_wide, y0, t_wide-t_wide/8,mPaint );

   canvas.drawCircle(x0+t_wide-8, y1, r-10, paint);

   canvas.drawCircle(x0+t_wide, y1, r-10, nPaint); 
   paint.setColor(color_white1);
   RectF Rect3 = new RectF(x0, y1, x0+t_wide, y1+t_wide);
   canvas.drawArc(Rect3, 0, 30, false, paint);

   while (ydegree > y0+30) {  
     canvas.drawLine(x1+10, ydegree, x1+15, ydegree, paintLine3); 
    if (ydegree % t_high == 0) { 
     canvas.drawLine(x1+10, ydegree, x1+50, ydegree, paintLine1); 
     canvas.drawText(min_temp + "", x1+55, ydegree + 5, text); 
     min_temp++; 
    } 
    else if(ydegree % (t_high/2) == 0)
    {
      canvas.drawLine(x1+10, ydegree, x1+25, ydegree, paintLine2); 
    }
    ydegree = ydegree - 2 ; 
   }  
} 
}

主程序:

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.temp_layout);

  innit(); // 初始化
 ActionBarUtils.initActionBar(getApplicationContext(), getActionBar(),
    "体温");

  timer = new Timer();

   start.setOnClickListener(new OnClickListener()
   {

   @Override
   public void onClick(View v) {
    // TODO 自动生成的方法存根
     timer= new Timer();

     handler = new Handler()
     { 
      @Override 
      public void handleMessage(Message msg) 
      {  //刷新图表 
        s = String.valueOf(min_data);   

        if(msg.what == 1)
        { 
         text1.setText(s); 
        }
        if(msg.what == 0)
        {
         String num = String.valueOf(number);
         text1.setText(num);
        }
        else if(msg.what == 2)
        {
         text1.setText("爆表啦");
        }

        super.handleMessage(msg); 
      } 
     };

     task = new TimerTask() 
     { 
      @Override 
      public void run() 
      { 
       Message message = new Message();
       // drawPmThread pm = new drawPmThread();
       if( min_data == number)
       {
        onDestroy();
       }

       if(number>40)
        {
        message.what = 2;
        handler.sendMessage(message);
        }

       if(0

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
author-avatar
罗丹灬_853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有