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

<?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" >

 <RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@drawable/b03"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin" >

  <LinearLayout
   android:id="@+id/linearLayout02"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="horizontal" >
  </LinearLayout>

  <LinearLayout
   android:id="@+id/linearLayout01"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" >

   <SurfaceView
    android:id="@+id/surfacetemp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="20dp" />
  </LinearLayout>

  <TextView
   android:id="@+id/textview01"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_alignParentLeft="true"
   android:layout_gravity="center"
   android:layout_marginTop="160dp"
   android:textColor="#00C957"
   android:textSize="40sp" />

  <TextView
   android:id="@+id/textview02"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginLeft="10dp"
   android:layout_marginTop="130dp"
   android:layout_toRightOf="@+id/textview01"
   android:textColor="#00FF00"
   android:textSize="30sp" />

  <TextView
   android:id="@+id/textview03"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginLeft="2dp"
   android:layout_marginTop="130dp"
   android:layout_toRightOf="@+id/textview02"
   android:textColor="#00FF00"
   android:textSize="60sp" />

  <Button
   android:id="@+id/button01"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   android:layout_alignParentLeft="true"
   android:layout_marginBottom="40dp"
   android:layout_marginLeft="50dp"
   android:background="@drawable/button_selector"
   android:text="开始"
   android:textColor="@color/paleturquoise"
   android:textSize="15sp" />

  <Button
   android:id="@+id/button02"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   android:layout_alignParentRight="true"
   android:layout_marginBottom="40dp"
   android:layout_marginRight="50dp"
   android:background="@drawable/button_selector"
   android:text="暂停"
   android:textColor="@color/paleturquoise"
   android:textSize="15sp" />
 </RelativeLayout>

</LinearLayout>

体温计绘制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<min_data && min_data < 35)
       {
        message.what = 0;
        handler.sendMessage(message);
       }
       else if (35<=min_data && min_data<number)
       {

        draw(min_data);
        message.what = 1;
        handler.sendMessage(message);
        min_data++;
       }

      }
     };
   //定时刷新
     timer.schedule(task, 4, 40);
   }
   }
    );

  stop.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    stopTimer();
   }
  });
 }

 // 初始化界面
 private void innit() {
  // TODO Auto-generated method stub
  start = (Button) findViewById(R.id.button01);
  stop = (Button) findViewById(R.id.button02);
  text1 = (TextView) findViewById(R.id.textview01);
  text2 = (TextView) findViewById(R.id.textview02);
  text3 = (TextView) findViewById(R.id.textview03);
  save = (TextView) findViewById(R.id.textView1);
  linearLayout02 = (LinearLayout) findViewById(R.id.linearLayout02);
  drawView = new DrawTemp(this);
  linearLayout02.addView(drawView);
  surface = (SurfaceView) findViewById(R.id.surfacetemp);

  String s2 = "o";
  String s3 = "C";
  text2.setText(s2);
  text3.setText(s3);
  TextPaint tp = start.getPaint();
  tp.setFakeBoldText(true);
  TextPaint tp1 = stop.getPaint();
  tp1.setFakeBoldText(true);
  scrn = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(scrn);

  holder = surface.getHolder();
  holder.addCallback(this);

  surface.setZOrderOnTop(true); //设置背景色为透明
  surface.getHolder().setFormat(PixelFormat.TRANSLUCENT);
  // thread = new Thread(this,"SurfaceView");

  width = scrn.widthPixels; // 宽度(PX)
  height = scrn.heightPixels; // 高度(PX)
  t_width = width/20;
  t_height = height/20;
  x0 = width/2+2*t_width;
  x1 = width/2+4*t_width;
  y1 = 10*t_height;

 }

 // 停止计时器
 private void stopTimer() {

  if (timer != null) {
   timer.cancel();
   timer = null;
  }

  if (task != null) {
   task.cancel();
   task = null;
  }
 }
 // 绘制体温动态柱形图
 private void draw(float min_data)
 {

  int ydegree = 9 * t_height;
  float y = ydegree - (min_data - 35) * t_height;
  Canvas canvas = holder.lockCanvas();
  // 绘制动态矩形
  Paint nPaint = new Paint();
  nPaint.setColor(Color.RED);
  canvas.drawRect(x0 + 10, y, x1 - 10, y1, nPaint);

  holder.unlockCanvasAndPost(canvas);// 更新屏幕显示内容 */
 }

 class MyCallBack implements SurfaceHolder.Callback {

  @Override
  public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
    int arg3) {
   // TODO Auto-generated method stub
  }

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

(0)

相关推荐

  • android电源信息查看(电量、温度、电压)实例代码

    本文实例讲述了android电源信息查看方法.分享给大家供大家参考.具体如下: 1. PowerTestActivity: import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os

  • Android自定义控件实现温度旋转按钮效果

    首先看下效果图 温度旋转按钮 实现思路 初始化一些参数 绘制刻度盘 绘制刻度盘下的圆弧 绘制标题与温度标识 绘制旋转按钮 绘制温度 处理滑动事件 提供一些接口方法 实现方法 初始化一些参数 public class TempControlView extends View { // 控件宽 private int width; // 控件高 private int height; // 刻度盘半径 private int dialRadius; // 圆弧半径 private int arcRa

  • Android实现动态体温计

    本文实例为大家分享了Android实现动态体温计的具体代码,供大家参考,具体内容如下 前段时间在做一个生理参数采集的项目,其中涉及到体温模块.这是我的部分总结. 实现内容: 从文件中读取体温数据,动态绘制体温的效果.即体温数据随时间在不停的变化.体温计绘制效果为立体效果. 实现原理: 1.体温计的绘制 绘制原理: 体温计的大体框架由图1,2,4,5,6,7构成,绘制通过自定义View,DrawView的onDraw()方法来实现,体温计水银柱的的绘制通过SurfaceView来实现.根据屏幕宽度

  • Android实现动态向Gallery中添加图片及倒影与3D效果示例

    本文实例讲述了Android实现动态向Gallery中添加图片及倒影与3D效果的方法.分享给大家供大家参考,具体如下: 在Android中gallery可以提供一个很好的显示图片的方式,实现上面的效果以及动态添加数据库或者网络上下载下来的图片资源.我们首先实现一个自定义的Gallery类. MyGallery.java: package nate.android.Service; import android.content.Context; import android.graphics.Ca

  • Android编程动态修改RelativeLayout宽高的方法

    本文实例讲述了Android编程动态修改RelativeLayout宽高的方法.分享给大家供大家参考,具体如下: 我们经常会动态修改RelativeLayout的宽高,这样的代码,比较简单,就是修改Relativelayout的LayoutParams就可以.代码一般如下: RelativeLayout ss = (RelativeLayout) findViewById(R.id.myRelativeLayout); ss.setLayoutParams(new RelativeLayout.

  • Android Fragment动态创建详解及示例代码

    Android Fragment 动态创建 Fragment是activity的界面中的一部分或一种行为.可以把多个Fragment组合到一个activity中来创建一个多界面并且可以在多个activity中重用一个Fragment.可以把Fragment任务模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除. Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影

  • Android编程动态按钮实现方法

    本文实例讲述了Android编程动态按钮实现方法.分享给大家供大家参考,具体如下: 第一种: 该方法通过onTouch来实现, btn3 = (ImageButton) findViewById(R.id.ImageButton03); btn3.setOnTouchListener(touchListener3); View.OnTouchListener touchListener = new OnTouchListener() { @Override public boolean onTo

  • Android滑动动态分页实现方法

    本文实例讲述了Android滑动动态分页实现方法.分享给大家供大家参考,具体如下: 实现 Android.widget.AbsListView.OnScrollListener 主要代码: private int lastItemIndex; @Override public void onScroll(AbsListView v, int firstVisibleItem,int visibleItemCount, int totalItemCount) { lastItemIndex = f

  • Android如何动态改变App桌面图标

    时不时的我们就会发现,一些我们常见的应用,比如某宝,某东,在一些特殊的日子中,比如双十一,元旦,为了迎合这样一个日子的气氛,在桌面的应用图标就会发生改变,其实对于这样的一个桌面图标更换,Android中为我们提供了AndroidManifest.xml里的<activity-alias>标签实现方式(更多文章请关注我的微信公众账号,左边二维码). 我们知道,我们每写一个 Activity就要在AndroidManifest进行配置一下,我们才可以正常的启动它,除此之外,我们还可以对它设置一个别

  • Android ViewPager动态加载问题

    今天做项目时,纠结了很久,动态添加view,刚开始按照其他的adapter处理,但是不会刷新view,来回翻几页,还会view覆盖,最后手动调用adapter的destroyItem和instantiateItem方法,还是不行,最后重写notifyDataSetChanged中removeAllViews和instantiateItem,有点效果,可是还是不理想.最后查询资料要重写PagerAdapter的方法 如下: public int getItemPosition(Object obj

  • Android编程动态加载布局实例详解【附demo源码】

    本文实例讲述了Android编程动态加载布局的方法.分享给大家供大家参考,具体如下: 由于前段时间项目需要,需要在一个页面上加载根据不同的按钮加载不同的布局页面,当时想到用 tabhot .不过美工提供的界面图完全用不上tabhot ,所以想到了动态加载的方法来解决这一需求.在这里我整理了一下,写了一个 DEMO 希望大家以后少走点弯路. 首先,我们先把界面的框架图画出来,示意图如下: 中间白色部门是一个线性布局文件,我喜欢在画图的时候用不同的颜色将一块布局标示出来,方便查看.布局文件代码如下:

  • Android实现动态自动匹配输入的内容

    本文实例为大家分享了Android实现动态自动匹配输入内容的具体代码,供大家参考,具体内容如下 用这两个控件 分别实现这两个: package com.example.autocomplete; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTe

随机推荐