电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

浅谈android之各类传感器

2022-04-17 10:25分类:传感器 阅读:

    感应器   感应器(英文名字:transducer/sensor)是一种检验设备,能感受到被检测的信息内容,能够将感受到的信息内容,按一定规律性转换变成电子信号或其它所需方式的信息内容輸出,以达到数据的传送、解决、储存、表明、纪录和操纵等规定。   感应器的特性包含:小型化、智能化、智能化系统、多用途化、专业化、数字化。它是完成自动化检测和智能控制的主要阶段。感应器的存有和发展趋势,让物品得到触感、味蕾和味觉等感观,让物件渐渐地越来越活了起來。一般 依据其几乎认知作用分成热敏元件、感光元器件、气敏元器件、力敏元器件、磁敏元器件、湿敏元器件、声敏元器件、射线光敏电阻器、色敏元器件和味敏元器件等十大类。   关键功效   大家为了能从外部获得信息,务必借助视觉器官。   而只靠我们自己的视觉器官,在探究天气现象和基本规律及其生产制造运动中两者的功用就不够了。为满足这些状况,就必须感应器。因而可以说,感应器是人们五官的增加,又称为电五官。   科技革命的来临,全球逐渐进到信息化时代。在使用数据的环节中,最先要处理的便是要获得精准靠谱的信息内容,而感应器是获得肯定和制造方面中数据的具体方式与方式。   在当代工业化生产尤其是自动化生产全过程中,要用各种各样感应器来监控和调节生产过程中的每个主要参数,使机器设备运行在常规情况或最好情况,并使设备做到最佳的品质。因而可以说,沒有很多的优质的感应器,智能化生产制造也就没有了基本。   在基础科学科学研究中,感应器更具备明显的影响力。当代科技的发展趋势,进入了很多新的领域:比如在宏观经济上需要观查过千亿光年的苍茫宇宙空间,外部经济上应观查小到fm的物体全球,竖向上应观查长达数十万年的星体演变,短到 s的瞬间反应。除此之外,还产生了对推进化学物质了解、发展新能源技术、新型材料等有着关键功效的各种各样极端化技术性科学研究,如高温高压、低温、高压、极高真空泵、强力电磁场、超弱电磁场这些。显而易见,要获得很多人们感观不能立即获得的信息内容,沒有相对应的感应器是不太可能的。很多基础学科科学研究的阻碍,最先就取决于目标数据的获得存有艰难,而一些新原理和高灵敏的检测传感器的发生,通常会致使该行业内的提升。一些感应器的发展趋势,通常是一些交叉学科开发设计的先行者。   感应器早就渗入例如工业化生产、宇宙空间开发设计、深海检测、生态环境保护、資源调研、医药学确诊、生物技术、乃至文化遗产保护这些非常之泛的行业。能够毫无夸大地说,从一望无际的外太空,到浩瀚无垠的深海,以致各种各样繁杂的工程项目系统软件,基本上每一个智能化新项目,都少不了各式各样的感应器。   不难看出,传感技术在发展经济、促进社会进步层面的关键功效,是十分显著的。世界各地都十分重视这一行业的发展趋势。坚信一段时间的未来,传感技术可能发生一个飞越,做到与其说关键位置相当的新水准。   主要特点   感应器的特性包含:小型化、智能化、智能化系统、多用途化、专业化、数字化,它不但增进了传统制造业的改建和升级换代,并且还有可能创建新式工业生产,进而变成 二十一世纪新的资金突破点。小型化是构建在微电子技术机械结构(MEMS)技术性基本上的,已完成运用在硅元器件上制成硅液位传感器。   感应器的构成   感应器一般由光敏电阻器、变换元器件、转换电源电路和輔助开关电源四部份构成。   光敏电阻器立即体会被精确测量,并輸出与被精确测量有确定关系的标量数据信号;变换元器件将光敏电阻器輸出的标量数据信号变换为电子信号;转换电源电路承担对变换元器件輸出的信号开展变大调配;变换元器件和转换电源电路一般还必须輔助开关电源供电系统。   关键作用   常将控制器的作用与人们5大视觉器官相比较:   光敏电阻——视觉效果   声敏感应器——听觉系统   气敏感应器——味觉   有机化学感应器——味蕾   压敏、温敏、   液体感应器——触感   光敏电阻器的归类:   物理学类,根据力、热、光、电、磁和弦等物理学效用。   化学类,根据化学变化的基本原理。   微生物类,根据酶、抗原、和生长激素等分子结构鉴别作用。   一般 据其几乎认知作用可分成热敏元件、感光元器件、气敏元器件、力敏元器件、磁敏元器件、湿敏元器件、声敏元器件、射线光敏电阻器、色敏元器件和味敏元器件等十大类(也有人曾将光敏电阻器分46类)。 浅谈android之各类传感器

  1、感应器新手入门

  自打美国苹果公司在2007年公布第一代iPhone至今,之前看起来和手机上挨不到边的感应器也渐渐变成 手机硬盘的关键构成部分。假如阅读者应用过iPhone、HTC Dream、HTC Magic、HTC Hero及其其它的Android手机上,会发觉根据将手机上横着或竖向置放,显示屏会伴随着手机号码位置的差异而转换方向。这类作用就必须根据压力感应器来完成,除开压力感应器,也有许多其他类型的感应器被使用到智能手机中,比如磁电式感应器便是最重要的一种感应器。尽管手机可以根据GPS来判定方位,但在GPS手机信号差或基本沒有GPS数据信号的情形下,GPS就名存实亡。这时候根据磁电式感应器就可以非常容易分辨方位(东、南、西、北)。拥有磁电式感应器,也使风水罗盘(别名偏向针)的数字化变成 很有可能。

  在Android应用软件中应用感应器要取决于android.hardware.SensorEventListener插口。根据该端口能够监视感应器的各种各样事情。SensorEventListener插口的源代码以下:

  package android.hardware;public interface SensorEventListener { public void onSensorChanged(SensorEvent event); public void onAccuracyChanged(Sensor sensor, int accuracy); }

  在SensorEventListener插口中理解了两种方式:onSensorChanged和onAccuracyChanged。当感应器的值发生改变时,比如磁电式感应器的角度更改的时候会启用onSensorChanged方式。当感应器的精密度转变 的时候会启用onAccuracyChanged方式。

  onSensorChanged方式只有一个SensorEvent种类的主要参数event,在其中SensorEvent类有一个values自变量十分关键,该变量值的类别是float[]。但该自变量数最多仅有3个原素,并且依据温度传感器的不一样,values自变量中原素所表示的含意也不一样。

  在表述values自变量中设计元素的含意以前,先来介绍一下Android的坐标系统是怎样界定X、Y、Z轴的。

  X轴的方位是顺着显示屏的水平方向从从左往右。假如手机上并不是方形得话,较短的边必须水准置放,较长的边必须竖直置放。

  Y轴的角度是以显示屏的左下方逐渐顺着显示屏的竖直方位偏向显示屏的顶部。

  将手机上放置在桌子上,Z轴的角度是以手机里偏向天上。

  下边是values自变量的要素在首要的控制器中所表示的含意。

  1.1方位感应器

  在方位感应器中values自变量的3个值都表明近视度数,他们的含意以下:

  values[0]:该值表明方向,也就是手机上绕着Z轴转动的视角。0表明北(North);90表明东(East);180表明南(South);270表明西(West)。假如values[0]的值恰好是这4个值,而且手机上是水准置放,表明手机上的正前便是这4个方位。能够借助这一特点来完成罗盘指南针,案例76将详解罗盘指南针的建立全过程。

  values[1]:该值表明坡度,或手机上翘起来的水平。当手机上绕着X轴偏斜时该值产生变化。values[1]的取值范围是-180≤values[1]

  ≤180。假定将手机屏朝上水准放到桌子上,这时候假如餐桌是彻底水准的,values[1]的值应当是0(因为非常少有餐桌是一定水准的,因而,该值很可能不以0,但一般全是-5和5中间的某些值)。这时候从手机上顶端逐渐伸出,直至将手机上沿X轴转动180度(显示屏往下水准放到桌面)。在这个转动全过程中,values[1]会在0到-180中间转变 ,换句话说,从手机上顶端伸出时,values[1]的值会慢慢缩小,直至相当于-180。假如从手机上底端逐渐伸出,直至将手机上沿X轴转动180度,这时候values[1]会在0到180中间转变 。也就是values[1]的值会逐步扩大,直至相当于180。能够运用values[1]和接下来要详细介绍的values[2]来精确测量餐桌等物件的坡度。

  values[2]:表明手机上顺着Y轴的翻转视角。取值范围是-90≤values[2]≤90。假定将手机屏朝上水准放到桌面,这时候假如桌面上是平的,values[2]的值应是0。将手机上左边慢慢伸出时,values[2]的值慢慢缩小,直至手机上垂直平分桌面上置放,这时候values[2]的值是-90。将手机上右边慢慢伸出时,values[2]的值慢慢扩大,直至手机上垂直平分桌面上置放,这时候values[2]的值是90。在竖直位子时再次往右边或往左边翻转,values[2]的值会持续在-90至90中间转变 。

  1.2加速传感器

  该感应器的values自变量的3个原素值各自表明X、Y、Z轴的加快值。比如,水准放到桌面的智能手机从左边向右边挪动,values[0]为负数;从右往左边挪动,values[0]为恰逢。阅读者能够根据这节的事例来感受加速传感器中的值的转变。要想应用相对应的感应器,仅完成SensorEventListener插口是远远不够的,还必须应用下边的编码来申请注册对应的感应器。

  // 得到感应器管理工具 SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE); // 申请注册方位感应器 sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST);

  假如想申请注册别的的感应器,能够更改getDefaultSensor方法的第一个变量值,比如,申请注册加速传感器能够应用Sensor.TYPE_ACCELEROMETER。在Sensor类中还理解了许多感应器变量定义,但要按照手机上中具体的系统配置来申请注册感应器。假如手机上中并没有相对的感应器硬件配置,即使申请注册了相对的感应器都不起任何的功效。getDefaultSensor方法的第2个主要参数表明得到感应器信息的速率。SensorManager.SENSOR_DELAY_ FASTEST表明尽量快地得到感应器数据信息。除开该值之外,还能够设定3个得到感应器信息的效率值,这种值以下:

  SensorManager.SENSOR_DELAY_NORMAL:默认设置 的得到感应器信息的速率。

  SensorManager.SENSOR_DELAY_GAME:假如运用感应器游戏开发,提议采用该值。

  SensorManager.SENSOR_DELAY_UI:假如应用感应器升级UI中的数据信息,提议采用该值。

  1.3重力传感器

  瞬时速度感应器的种类变量定义是Sensor.TYPE_GRAVITY。压力感应器与瞬时速度感应器应用同一套平面坐标。values二维数组中三个原素分別表明了X、Y、Z轴的重力大小。Android SDK界定了一些变量定义,用以表明星球中大行星、通讯卫星和太阳表面的作用力。下边就来温习一下天文知识,未来假如在地球上之外用Android手机上,或许会用得着。

  public staTIc final float GRAVITY_SUN= 275.0f;public staTIc final float GRAVITY_MERCURY= 3.70f;public staTIc final float GRAVITY_VENUS= 8.87f;public staTIc final float GRAVITY_EARTH= 9.80665f;public static final float GRAVITY_MOON= 1.6f;public static final float GRAVITY_MARS= 3.71f;public static final float GRAVITY_JUPITER= 23.12f;public static final float GRAVITY_SATURN= 8.96f;public static final float GRAVITY_URANUS= 8.69f;public static final float GRAVITY_NEPTUNE= 11.0f;public static final float GRAVITY_PLUTO= 0.6f;public static final float GRAVITY_DEATH_STAR_I= 0.000000353036145f;public static final float GRAVITY_THE_ISLAND= 4.815162342f;

  1.4 光线感应器

  光线感应器的种类变量定义是Sensor.TYPE_LIGHT。values二维数组仅有第一个原素(values[0])更有意义。表明光源的抗压强度。较大的值是120000.0f。Android SDK将光源抗压强度划分为不一样的级别,每一个级别的最高值由一个变量定义表明,这种变量定义都界定在SensorManager类中,编码以下:

  public static final float LIGHT_SUNLIGHT_MAX =120000.0f;public static final float LIGHT_SUNLIGHT=110000.0f;public static final float LIGHT_SHADE=20000.0f;public static final float LIGHT_OVERCAST= 10000.0f;public static final float LIGHT_SUNRISE= 400.0f;public static final float LIGHT_CLOUDY= 100.0f;public static final float LIGHT_FULLMOON= 0.25f;public static final float LIGHT_NO_MOON= 0.001f;

  上边的八个变量定义仅仅临界点。阅读者在具体应用光线感应器时要依据具体情况明确一个范畴。比如,当太阳光慢慢冉冉升起时,values[0]的值很可能会超出LIGHT_SUNRISE,当values[0]的值慢慢增加时,便会慢慢翻过LIGHT_OVERCAST,而做到LIGHT_SHADE,自然,假如天特别好得话,也有可能会做到LIGHT_SUNLIGHT,乃至高些。

  1.5手机陀螺仪感应器陀

  手机陀螺仪感应器的种类变量定义是Sensor.TYPE_GYROSCOPE。values二维数组的三个原素表明的含意以下:values[0]:延X轴转动的角速度。

  values[1]:延Y轴转动的角速度。

  values[2]:延Z轴转动的角速度。

  当手机上反方向转动时,角速度为恰逢,顺时针方向转动时,角速度为负数。手机陀螺仪感应器常常被用于测算手机上已旋转的视角,编码以下:

  private static final float NS2S = 1.0f / 1000000000.0f;private float timestamp;public void onSensorChanged(SensorEvent event){ if (timestamp != 0) { // event.timesamp表明目前的時间,企业是纳秒(1百万分之一ms) final float dT = (event.timestamp - timestamp) * NS2S; angle[0] = event.values[0] * dT; angle[1] = event.values[1] * dT; angle[2] = event.values[2] * dT; } timestamp = event.timestamp;}

  上边编码中根据手机陀螺仪感应器邻近2次得到数据信息的时差(dT)来各自测算在这段时间内手机上延X、 Y、Z轴转动的视角,并将值各自累积到angle二维数组的差异原素上。

  1.6别的感应器

  别的感应器在前面几组详细介绍了瞬时速度感应器、压力感应器、光线感应器、手机陀螺仪感应器及其方位感应器。除开这种感应器外,Android SDK还适用以下的几类感应器。有关这种感应器的使用说明及其与这种感应器有关的变量定义、方式,阅读者能够参考官方网文本文档。

  短程感应器(Sensor.TYPE_PROXIMITY)

  线形瞬时速度感应器(Sensor.TYPE_LINEAR_ACCELERATION)

  转动空间向量感应器(Sensor.TYPE_ROTATION_VECTOR)

  电磁场感应器(Sensor.TYPE_MAGNETIC_FIELD)

  液位传感器(Sensor.TYPE_PRESSURE)

  温度感应器(Sensor.TYPE_TEMPERATURE)

  尽管AndroidSDK界定了十多种感应器,但并没有每一部手机都充分适用这种感应器。比如,Google Nexus S适用在其中的9种感应器(不兼容工作压力和温度感应器),而HTC G7只适用在其中的5种感应器。假如采用了手机上不兼容的感应器,一般不容易抛出异常,但也不能得到感应器传到的数据信息。阅读者在采用感应器时尽量先分辨当下的智能手机是不是适用所运用的感应器。

  2. 检测手机上中有什么感应器

  我们可以利用以下三步应用感应器。

  (1)撰写一个捕获感应器事情的类。此类务必完成android.hardware.SensorEventListener插口。

  (2)得到感应器管理职能(SensorManager目标)。

  (3)应用SensorManager.registerListener方法申请注册特定的感应器。根据上边三步早已建立了感应器应用软件的架构。而实际的运行必须在SensorEventListener插口的onSensorChanged和onAccuracyChanged方式中进行。SensorEventListener插口的理解以下:

  packageandroid.hardware;public interfaceSensorEventListener {《span style=“white-space:pre”》 《/span》//感应器数据信息变动时启用《span style=“white-space:pre”》 《/span》public void onSensorChanged(SensorEventevent);《span style=“white-space:pre”》 《/span》//感应器精准度转变 时启用《span style=“white-space:pre”》 《/span》public void onAccuracyChanged(Sensorsensor, int accuracy);}

  SensorManager目标根据getSystemService方式得到,编码以下:

  SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

  一般 手机上中包括了多个感应器控制模块(如方位感应器、光线感应器等),因而,申请注册感应器必须特定感应器的种类,如下边的编码申请注册了光线感应器。

  sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),SensorManager.SENSOR_DELAY_FASTEST);

  registerListener方法有三个主要参数。第1个主要参数是完成SensorEventListener插口的目标。第2个主要参数用以特定感应器的种类。AndroidSDK事先定位了表明各种各样控制器的变量定义,这种变量定义都被放到Sensor类中。比如,上边编码中的Sensor.TYPE_LIGHT。第3个主要参数表明感应器得到数据信息的速率。该主要参数可安装的变量定义以下:

  SENSOR_DELAY_FASTEST:以迅速得到感应器数据信息。

  SENSOR_DELAY_GAME:合适于在游戏内得到感应器数据信息。

  SENSOR_DELAY_UI:合适于在UI控制中得到感应器数据信息。

  SENSOR_DELAY_NORMAL:以一般的速率得到感应器的数据信息。

  上边四种种类得到感应器信息的速率先后下降。从理论上说,得到感应器信息的效率越快,耗费的服务器资源越大。因而提议阅读者压根具体情况挑选合理的速率得到感应器的数据信息。

  假如想终止得到感应器数据信息,能够使用unregisterSensor方法销户感应器事情目标。unregisterSensor方法的理解以下:

  public voidunregisterListener(SensorEventListener listener)public voidunregisterListener(SensorEventListener listener, Sensor sensor)

  unregisterSensor方法有两个轻载方式。第一个轻载方式用以销户全部的感应器目标。第二个轻载方式用以销户特定感应器的事情目标。在其中Sensor目标根据SensorManager.getDefaultSensor方法得到。getDefaultSensor方法只有一个int类型的主要参数,表明感应器的种类。如Sensor.TYPE_LIGHT表明光线感应器。

  留意:一个感应器对像能够解决好几个感应器。换句话说,一个完成SensorEventListener插口的类能够接受好几个感应器传到的数据信息。为了更好地区别不一样的感应器,必须 应用Sensor.getType方式来得到感应器的种类。getType方式的将在这节的事例中详解。

  根据SensorManager.getSensorList方式还可以得到特定感应器的信息内容,还可以得到手机上适用的全部感应器的信息内容,编码以下:

  //得到光线感应器List《Sensor》sensors = sensorManager.getSensorList(Sensor.TYPE_LIGHT);//得到手机上适用的全部感应器List《Sensor》sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

  下边得出一个完全的事例来演试如何获得感应器传到的数据信息。本例从以下4个感应器得到数据信息,与此同时輸出了检测手机上中适用的全部感应器名字。

  瞬时速度感应器(Sensor.TYPE_ACCELEROMETER)

  电磁场感应器(Sensor.TYPE_MAGNETIC_FIELD)

  光线感应器(Sensor.TYPE_LIGHT)

  方位感应器(TYPE_ORIENTATION)

  本例必须在真机里运作。因为不一样的智能手机很有可能适用的感应器不一样(有的手机上并不兼容Android SDK中界定的全部感应器),因而,假如运作程序流程后,无法显示某一感应器的数据信息,表明目前的手机上并不兼容这一感应器。

  本例的详细代碼以下:

  package mobile.android. sensor; import java.util.List;import android.app.Activity;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.widget.TextView; public class Main extends Activity implements SensorEventListener{ private TextView tvAccelerometer; private TextView tvMagentic; private TextView tvLight; private TextView tvOrientation; private TextView tvSensors; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 得到SensorManager目标 SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // 申请注册瞬时速度感应器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST); // 申请注册电磁场感应器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_FASTEST); // 申请注册光线感应器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_FASTEST); // 申请注册方位感应器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST); tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer); tvMagentic = (TextView) findViewById(R.id.tvMagentic); tvLight = (TextView) findViewById(R.id.tvLight); tvOrientation = (TextView) findViewById(R.id.tvOrientation); tvSensors = (TextView)findViewById(R.id.tvSensors); // 得到当今手机上适用的全部感应器 List《Sensor》 sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); for(Sensor sensor:sensors) { // 輸出当今感应器的名字 tvSensors.append(sensor.getName() “\n”); } } @Override public void onSensorChanged(SensorEvent event) { // 根据getType方式得到当今传到数据信息的传感器分类 switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: // 解决瞬时速度感应器传到的数据信息 String accelerometer = “瞬时速度\n” “X:” event.values[0] “\n” “Y:” event.values[1] “\n” “Z:” event.values[2] “\n”; tvAccelerometer.setText(accelerometer); break; case Sensor.TYPE_LIGHT: // 解决光线感应器传到的数据信息 tvLight.setText(“色度:” event.values[0]); break; case Sensor.TYPE_MAGNETIC_FIELD: // 解决电磁场感应器传到的数据信息 String magentic = “电磁场\n” “X:” event.values[0] “\n” “Y:” event.values[1] “\n” “Z:” event.values[2] “\n”; tvMagentic.setText(magentic); break; case Sensor.TYPE_ORIENTATION: // 解决方位感应器传到的数据信息 String orientation = “方位\n” “X:” event.values[0] “\n” “Y:” event.values[1] “\n” “Z:” event.values[2] “\n”; tvOrientation.setText(orientation); break; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }}

  上边的源代码中采用了event.values二维数组中的信息来得到感应器传到的数据信息。这一values二维数组十分关键,它的总长度为3。但不一定每一个二维数组原素都是有实际意义。针对不一样的感应器,每一个二维数组原素的含意不一样。在下面的一部分将详解不一样感应器中values二维数组每个因素的含意。

  留意:尽管应用Sensor.TYPE_ALL能够得到手机上适用的全部感应器信息内容,但无法应用Sensor.TYPE_ALL申请注册全部的感应器,也就是getDefaultSensor方法的变量值务必是某一感应器的种类变量定义,而无法是Sensor.TYPE_ALL。

  3、感应器运用

  3.1罗盘指南针

  罗盘指南针又叫电子器件罗盘

  在其中N、S、W和E各自表明北、南、西和东4个方位。

  本例只应用了onSensorChanged事情方式及values[0]。因为罗盘图象上边是北,当手机上正前方是正北方时(values[0]=0),图象不用转动。但要不是正北方,就必须将图片按一定视角转动。假定当今values[0]的值是60,表明方位在东北方。换句话说,手机上顶端由北向东转动。这时候假如图象不转动,N的方位恰好和正北方的交角是60度,必须 将图象反方向(从东向北转动)转动60度,N才会偏向正北方。因而,能够运用在11.2.3节详细介绍的转动补间动画来转动罗盘图象,编码以下:

  public void onSensorChanged(SensorEvent event){ if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { float degree = event.values[0]; // 以罗盘图象核心为轴逆时针方向转动degree度 RotateAnimation ra = new RotateAnimation(currentDegree, -degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); // 在200ms以内进行转动姿势 ra.setDuration(200); // 逐渐转动图象 imageView.startAnimation(ra); // 储存转动后的近视度数,currentDegree是一个在类中界定的float种类自变量 currentDegree = -degree;}}

  上边的源代码中采用了event.values二维数组中的信息来得到感应器传到的数据信息。这一values二维数组十分关键,它的总长度为3。但不一定每一个二维数组原素都是有实际意义。针对不一样的感应器,每一个二维数组原素的含意不一样。在下面的一部分将详解不一样感应器中values二维数组每个因素的含意。

  留意:尽管应用Sensor.TYPE_ALL能够得到手机上适用的全部感应器信息内容,但无法应用Sensor.TYPE_ALL申请注册全部的感应器,也就是getDefaultSensor方法的变量值务必是某一感应器的种类变量定义,而无法是Sensor.TYPE_ALL。

  3.2 计步软件

  还能够运用方位感应器作出更有意思的运用,比如运用values[1]或values[2]的改变完成一个计步软件。因为人到走路的时候会左右震动,因而,能够根据分辨values[1]或values[2]平均值的震荡转变 开展记步。基本概念是在onSensorChanged方式中测算2次得到values[1]值的差,并依据误差在一定范畴以外逐渐记数,编码以下:

  public void onSensorChanged(SensorEvent event){ if (flag) { lastPoint = event.values[1]; flag = false; } // 当2个values[1]值之差的平方根超过8时觉得离开了一步 if (Math.abs(event.values[1] - lastPoint) 》 8) { // 储存最后一步时的values[1]的最高值 lastPoint = event.values[1]; // 将当今记数表明在TextView部件中 textView.setText(String.valueOf( count)); }}

  本例设定3个按键用以操纵记步的情况,这3个按键还可以操纵逐渐记步、重值(将计计步清0)和终止记步。这3个按键的点击事情编码以下:

  public void onClick(View view){ String msg = “”; switch (view.getId()) { // 逐渐记步 case R.id.btnStart: sm = (SensorManager) getSystemService(SENSOR_SERVICE); // 申请注册方位感应器 sm.registerListener(this, sm .getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST); msg = “早已逐渐计步软件。”; break; // 重设计步软件 case R.id.btnReset: count = 0; msg = “早已重设计步软件。”; break; // 终止记步 case R.id.btnStop: // 销户方位感应器 sm.unregisterListener(this); count = 0; msg = “早已终止计步软件。”; break; } textView.setText(String.valueOf(count)); Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();}

  4、手机上翻转静音

  与手机来电一样,手机上旋转情况(重力感应器)也由服务程序给予。重力感应器服务项目(android.hardware.SensorManager目标)能够借助以下编码得到:

  SensorManager sensorManager =(SensorManager)getSystemService(Context.SENSOR_SERVICE);

  本例必须在手机模拟器上仿真模拟重力感应器,因而,在本例中应用SensorSimulator中的一个类(SensorManagerSimulator)来得到重力感应器服务项目,这一类封裝了SensorManager目标,并承担与服务器端实现通讯,监视重力感应器事情也必须一个窃听器,该窃听器必须完成SensorListener插口,并根据该插口的onSensorChanged事情方式得到重力感应器数据信息。本例详细的源代码以下:

  package net.blogjava.mobile;import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;import android.app.Activity;import android.content.Context;import android.hardware.SensorListener;import android.hardware.SensorManager;import android.media.AudioManager;import android.os.Bundle;import android.widget.TextView;public class Main extends Activity implements SensorListener{private TextView tvSensorState;private SensorManagerSimulator sensorManager;@Overridepublic void onAccuracyChanged(int sensor, int accuracy){}@Overridepublic void onSensorChanged(int sensor, float[] values){switch (sensor){case SensorManager.SENSOR_ORIENTATION:// 得到响声服务项目AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);// 在这儿要求旋转视角低于-120度时静音模式,values[2]表明旋转视角,还可以设定别的视角if (values[2] 《 -120){audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);}else{audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);}tvSensorState.setText(“视角:” String.valueOf(values[2]));break;}}@Overrideprotected void onResume(){// 申请注册重力感应器监视事情sensorManager.registerListener(this, SensorManager.SENSOR_ORIENTATION);super.onResume();}@Overrideprotected void onStop(){// 撤销对重力感应器的监视sensorManager.unregisterListener(this);super.onStop();}@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 根据SensorManagerSimulator目标得到重力感应器服务项目sensorManager = (SensorManagerSimulator) SensorManagerSimulator.getSystemService(this, Context.SENSOR_SERVICE);// 联接到服务器端程序流程(务必实行接下来的编码)sensorManager.connectSimulator();}}

  在上面的源代码中采用了一个SensorManagerSimulator类,此类在SensorSimulator工具箱带的sensorsimulator-lib.jar文件中,能够在lib文件目录中找出这一jar文件。在应用SensorManagerSimulator类以前,务必在对应的Eclipse工程项目中引入这一jar文件。

  如今运作本例,并根据服务器端主界面右边的【Roll】滚动杆挪动到规定的视角,比如,-74.0和-142.0,这时候设定的方向会展现在显示屏上


上一篇:浅谈传感器中的环境传感器

下一篇:学些传感器必须掌握的一些知识

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部