我的Android进阶之旅------Android利用温度传感器实现带动画效果的电子温度计

     要想实现带动画效果的电子温度计,需要以下几个知识点:

1、温度传感器相关知识。

2、ScaleAnimation动画相关知识,来进行水印刻度的缩放效果。

3、android:layout_weight属性的合理运用,关于android:layout_weight属性的讲解,可以参考:《我的Android进阶之旅------>关于android:layout_weight属性的一个面试题》

地址为:http://blog.csdn.net/ouyang_peng/article/details/13236519



     首先来看看本实例的具体效果,然后再来具体实现功能。

1、将温度强制设置为0度时,画面如下:

 

 

2、将温度强制设置为50度时,画面如下:

 

 

3、将温度强制设置为-20度时,画面如下:

 

 

4、从传感器动态得到温度值,并实时更新画面,如下所示:

 

                                                                                          

本文《我的Android进阶之旅------>Android利用温度传感器实现有动画效果的电子温度计

(地址:http://blog.csdn.net/ouyang_peng/article/details/48790289)

 

 

首先来看布局文件的代码:layout_thermometer.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/Parent"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/background_thermometer"android:clipChildren="false"android:clipToPadding="false"android:gravity="bottom|center"android:keepScreenOn="true"android:orientation="vertical" ><FrameLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_gravity="bottom|center" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><!-- 顶部图片 --><ImageViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:src="@drawable/background_top" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="100.0"android:orientation="horizontal" ><!-- 横向空白占1份 --><LinearLayoutandroid:layout_width="0dp"android:layout_height="fill_parent"android:layout_weight="1"android:gravity="bottom|center" ></LinearLayout><!-- 横向占4份 --><LinearLayoutandroid:id="@+id/meter"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_weight="4"android:animationCache="true"android:background="@drawable/thermometer_dial"android:clipChildren="false"android:clipToPadding="false"android:persistentDrawingCache="all" ><!-- 横向占189份,刻度表左边刻度摄氏温度所占比例 --><LinearLayoutandroid:layout_width="0dp"android:layout_height="fill_parent"android:layout_weight="189"android:visibility="invisible" /><!-- 横向占69份,刻度表水银柱子所在区域所占比例 --><LinearLayoutandroid:layout_width="0dp"android:layout_height="fill_parent"android:layout_weight="69"android:orientation="vertical" ><!-- 竖向占131.0份,刻度表50°以上的部分 --><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="131.0" /><!--竖向占773.0份,水银针正好等于刻度表从-20°到50° 因为柱子和圆球直接有点断层,把773变成774默认不显示柱子,当有传感器数据时,才显示出来 --><LinearLayoutandroid:id="@+id/alcohol"android:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="774.0"android:background="@drawable/alcohol"android:orientation="horizontal"android:visibility="invisible" /><!--竖向占104.0份 ,刻度表-20°以上的部分 因为柱子和圆球直接有点断层,把104变成103--><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="103.0" /></LinearLayout><!-- 横向占189份,刻度表右边刻度华氏温度所占比例 --><LinearLayoutandroid:layout_width="0dp"android:layout_height="fill_parent"android:layout_weight="187"android:visibility="invisible" /></LinearLayout><!-- 横向占4份 --><LinearLayoutandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginTop="150dp"android:layout_weight="4"android:gravity="center"android:orientation="vertical"android:paddingLeft="30dp" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal" ><!-- 摄氏温度 --><TextViewandroid:id="@+id/thermo_c"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#e9bc57"android:textSize="38sp" /><!-- 摄氏温度图标 --><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:paddingLeft="2dp"android:src="@drawable/thermo_c" /></LinearLayout><!-- 分割线 --><ImageViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:src="@drawable/divider" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal" ><!-- 华氏温度 --><TextViewandroid:id="@+id/thermo_f"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#dadada"android:textSize="18sp" /><!-- 华氏温度图标 --><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:paddingLeft="2dp"android:src="@drawable/thermo_f" /></LinearLayout></LinearLayout><!-- 横向空白占1份 --><LinearLayoutandroid:layout_width="0dp"android:layout_height="fill_parent"android:layout_weight="1"android:gravity="bottom|center" ></LinearLayout></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center_vertical"android:orientation="vertical" ><!-- 作者信息--><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ffff00"android:textSize="18sp"android:text="@string/author"android:layout_gravity="center"/><!-- 博客地址 --><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:autoLink="web"android:text="@string/blog_address"android:textColor="#ffff00"android:textSize="18sp" /></LinearLayout><!-- 尾部图片 --><ImageViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:src="@drawable/background_bottom" /></LinearLayout></FrameLayout></LinearLayout>


接着看Activity的代码:ThermometerActivity.java

package com.oyp.thermometer;import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.animation.ScaleAnimation;
import android.widget.LinearLayout;
import android.widget.TextView;/*** @author 欧阳鹏* @date 2015年9月14日 <br>*       <a href="http://blog.csdn.net/ouyang_peng">欧阳鹏CSDN博客地址</a></n>*/
public class ThermometerActivity extends Activity implements SensorEventListener {private LinearLayout alcohol;private LinearLayout meter;private SensorManager mSensorManager;private Sensor temperatureSensor;private TextView thermo_c;private TextView thermo_f;public float staratemp;public float temp;private float temperatureC;/*** 获取华氏温度* * @author ouyang* @date 2015年9月14日* @return*/public float getTemperatureF() {float temperatureF = (temperatureC * 9 / 5) + 32;return getFloatOne(temperatureF);}/*** 保留一位小数点* * @author ouyang* @date 2015年9月14日* @param tempFloat* @return*/public float getFloatOne(float tempFloat) {return (float) (Math.round(tempFloat * 10)) / 10;}/*** 获取摄氏温度* * @author ouyang* @date 2015年9月14日* @return*/public float getTemperatureC() {return getFloatOne(temperatureC);}public void setTemperatureC(float temperatureC) {this.temperatureC = temperatureC;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_thermometer);meter = ((LinearLayout) findViewById(R.id.meter));alcohol = ((LinearLayout) findViewById(R.id.alcohol));thermo_c = (TextView) findViewById(R.id.thermo_c);thermo_f = (TextView) findViewById(R.id.thermo_f);}@Overrideprotected void onResume() {super.onResume();mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);temperatureSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);mSensorManager.registerListener(this, temperatureSensor, SensorManager.SENSOR_DELAY_NORMAL);}@Overridepublic final void onSensorChanged(SensorEvent event) {float temperatureValue = event.values[0]; // 得到温度setTemperatureC(temperatureValue);// 设置温度mUpdateUi();// 更新UI}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}/*** 更新刻度上水银柱的长度* * @author ouyang* @date 2015年9月14日*/private void mUpdateUi() {ScaleAnimation localScaleAnimation1 = new ScaleAnimation(1.0F, 1.0F, this.staratemp, this.temp, 1, 0.5F, 1,1.0F);localScaleAnimation1.setDuration(2000L);localScaleAnimation1.setFillEnabled(true);localScaleAnimation1.setFillAfter(true);this.alcohol.startAnimation(localScaleAnimation1);this.staratemp = this.temp;ScaleAnimation localScaleAnimation2 = new ScaleAnimation(1.0F, 1.0F, 1.0F, 1.0F, 1, 0.5F, 1, 0.5F);localScaleAnimation2.setDuration(10L);localScaleAnimation2.setFillEnabled(true);localScaleAnimation2.setFillAfter(true);this.meter.startAnimation(localScaleAnimation2);// 把刻度表看出总共700份,如何计算缩放比例。从-20°到50°。// 例如,现在温度是30°的话,应该占(30+20)*10=500份 其中20是0到-20°所占有的份this.temp = (float) ((20.0F + getTemperatureC()) * 10) / (70.0F * 10);thermo_c.setText(getTemperatureC() + "");thermo_f.setText(getTemperatureF() + "");}
}


 

 具体代码可以在下面地址中免费下载:

 

 http://download.csdn.net/detail/qq446282412/9145961




        ====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

====================================================================================



 

转载于:https://www.cnblogs.com/ouyangpeng/p/8537889.html

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

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

相关文章

mybatis中的#和$的区别

为什么80%的码农都做不了架构师&#xff1f;>>> 1. #将传入的数据都当成一个字符串&#xff0c;会对自动传入的数据加一个双引号。如&#xff1a;order by #user_id#&#xff0c;如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是…

MINA2 源代码学习--源代码结构梳理

一、mina总体框架与案例&#xff1a; 1.总体结构图&#xff1a; 简述&#xff1a;以上是一张来自网上比較经典的图&#xff0c;总体上揭示了mina的结构&#xff0c;当中IoService包括clientIoConnector和服务端IoAcceptor两部分。即不管是client还是服务端都是这个结构。IoServ…

如何查看mac系统是32位还是64位的操作系统

&#xff08;一&#xff09;点击工具栏左上角点击 &#xff08;苹果Logo&#xff09;标志&#xff0c;关于本机 --> 更多信息 --> 系统报告 -->(左侧栏中)软件 &#xff08;二&#xff09;打开终端&#xff0c;输入命令 uname -a 回车 x86_64 表示系统为64位 i68…

3ds max删除了对象后,还是将原来所有对象输出的原因

原因是场景中除了 几何体 外还有 图形&#xff0c;如下图 将这些图形删除&#xff0c;几何体就都正常输出了。 转载于:https://www.cnblogs.com/qingsunny/p/4236530.html

后代选择器

1 <!DOCTYPE HTML>2 <html>3 <head>4 <meta http-equiv"Content-Type" content"text/html; charsetutf-8">5 <title>后代选择器</title>6 <style type"text/css">7 .first span{8 color:red;9 …

u-boot分析(八)----串口初始化

u-boot分析&#xff08;八&#xff09; 上篇博文我们按照210的启动流程&#xff0c;分析到了内存初始化&#xff0c;今天我们继续按照u-boot的启动流程对串口的初始化进行分析。 今天我们会用到的文档&#xff1a; 1. 2440芯片手册&#xff1a;http://download.csdn.net…

linux 开启防火墙的指定端口

2019独角兽企业重金招聘Python工程师标准>>> 通过下面的命令可以开启允许对外访问的网络端口&#xff1a; /sbin/iptables -I INPUT -p tcp --dport 8011 -j ACCEPT #开启8011端口 /etc/rc.d/init.d/iptables save #保存配置 /etc/rc.d/init.d/iptables restart #…

关于webstorm 配置 banbel

2019独角兽企业重金招聘Python工程师标准>>> file type : javascript files scope: project files program: ..............appData\Roaming\npm\babel.cmd argumemt: $FileName$ --out-file $FileNameWithoutExtension$.js -s ps: --out-put 输出es5 格式的文件 …

微信朋友圈广告详细说明

根据官方发布的微信广告系统介绍&#xff0c;朋友圈广告来源于微信广告的一部分&#xff0c;与公众号广告形成了一整个体系。关于公众号的广告&#xff0c;简单说&#xff0c;他可以把微信公众号变成广告牌&#xff0c;会根据用户的阅读习惯以及个人信息来进行广告的投放。每一…

EasyExcel 导出文件的格式化

阿里开源的这个库&#xff0c;让 Excel 导出不再复杂&#xff08;既要能写&#xff0c;还要写的好看&#xff09; 之前聊了 EasyExcel 的内容导出&#xff0c;本文主要说一下导出文件的格式化&#xff0c;格式化包括工作表/单元格样式和内容格式化。毕竟&#xff0c;有时候还是…

oracle闪回某个时间点的数据库,oracle11g 使用闪回查询恢复表到过去某一个时间点...

一、新建测试表并插入数据&#xff1a;oracle二、模拟表数据误删并提交&#xff1a;测试三、使用闪回查询来查误删前表的数据&#xff1a;(表误删是在15:08分左右误删&#xff0c;所以在15:08分以前表的数据仍是在的)&#xff1a;spa四、用如今的数据与误删前的数据作对比&…

opengl微开发之1-从零開始

对OpenGL有一点了解之后&#xff0c;如今開始真正编写代码。 今天的内容&#xff1a; 使用FreeGLUT创建OpenGL的上下文环境 初始化GLEW 创建一个OpenGL的的模板范例 第一步&#xff1a; 一个OpenGL的上下文能够同意我们传递命令究竟层硬件&#xff0c;所以须要一个上下文环境。…

Git客户端(Windows系统)的使用(Putty)(转)

本文环境&#xff1a; 操作系统&#xff1a;Windows XP SP3 Git客户端&#xff1a;TortoiseGit-1.8.14.0-32bit 一、安装Git客户端 全部安装均采用默认&#xff01; 1. 安装支撑软件 msysgit: http://msysgit.github.io/ 当前最新版本为v1.9.5。 2. 安装TortoiseGit 首先&#…

两道二分coming~

第一道&#xff1a;poj 1905Expanding Rods 题意&#xff1a;两道墙&#xff08;距离L&#xff09;之间架一根棒子&#xff0c;棒子受热会变长&#xff0c;弯曲&#xff0c;长度变化满足公式&#xff08; s(1n*C)*L&#xff09;&#xff0c;求的是弯曲的高度h。 首先来看这个图…

十天学Linux内核之第七天---电源开和关时都发生了什么

十天学Linux内核之第七天---电源开和关时都发生了什么 原文:十天学Linux内核之第七天---电源开和关时都发生了什么说实话感觉自己快写不下去了&#xff0c;其一是有些勉强跟不上来&#xff0c;其二是感觉自己越写越差&#xff0c;刚开始可能是新鲜感以及很多读者的鼓励&#xf…

dede php 里加nofollow,织梦导航栏目如何加nofollow

很多用织梦程序做网站的朋友会发现&#xff0c;dedecms后台并没有直接加nofollow的选项。那如果想要给联系我们、关于我们等导航栏目加上nofollow该怎么解决呢&#xff1f;笔者在网上也找了一些资料&#xff0c;有通过修改数据库增加参数的方法&#xff0c;但没有成功。今天笔者…

【Cocos2d-Js实战教学(1)横版摇杆八方向移动】

本教程主要通过搭建一个横版摇杆八方向移动的实例&#xff0c;让大家如何用Cocos2dx-Js来做一款游戏&#xff0c;从基础了解Cocos2dx-Js的基本实现原理&#xff0c;从创建工程&#xff0c;到各个知识点的梳理。 教程分为上下两讲&#xff1a; 上讲有2个小节&#xff1a; 1&…

在单文档中显示我的第一个对话框

在单文档中显示我的第一个对话框 (2010-04-19 21:19:50) 转载▼标签&#xff1a; it 今天编写了在单文档中创建对话框以及调用对话框的代码&#xff0c;收获很多&#xff1b; 1&#xff1a;OnInitDialog函数的加载问题尤其是在VS上的加载&#xff1b;&#xff08;这一点花了…

主机Window不能访问该虚拟机Linux Samba文件服务提供了一个文件夹

我最近遇到一个问题。虚拟机Linux中间Samba服务常开。主办“\\192.168.229.200” (我的虚拟机Linux址)訪问不了Share文件夹&#xff08;/var/test&#xff09;&#xff0c;并且经过数次的重新启动&#xff0c;检查配置。再重新启动&#xff0c;都没法解决。后来突然想到了主机管…

Linux进程间通信(四) - 共享内存

共享内存的优势 采用共享内存通信的一个显而易见的好处是效率高&#xff0c;因为进程可以直接读写内存&#xff0c;而不需要任何数据的拷贝。对于像管道和消息队列等通信方式&#xff0c;则需要在内核和用户空间进行四次的数据拷贝&#xff0c;而共享内存则只拷贝两次数据&…