题记:许多小伙伴都叫我写个android的教程,我觉得网上已经有很多很棒的教程了,特别是老罗和Mars的视频都非常棒,我只是个小菜鸟,何德何能做个教程了,很多时候我已经和大家说不要私信给我,但是还是有很多人私信于我,在此我觉得许多问题不是我一个人能解决的,大家可以在论坛发贴,让大家一起解决。不过既然大家那么信任我,我就写些项目经历和大家分享,简单的基础我就不说了,直接从项目开始吧,文章可能时断时续的上传,因为我也遇到了许多问题,待大神看了以后指导,关于相关demo,由于涉及到版权问题和来自贫困山区的我,有些比较好的demo可能需要付费才能下载,知识产权嘛,顺便捐赠下贫困山区的我,文章可能不是很专业,因为我也是边研究边和大家分享的,顺便让我能更好的学习android,好的,多的不说了,android高分段进阶攻略从现在开始。

我们是什么时候开始知道有传感器这儿玩意的,其实是iphone第一代,随着越来越多的应用开始和硬件挂接,提高用户体验性,传感器开始由不靠谱变得大势所趋,传感器有些什么了,方向,重力,加速度,光线,磁场,临近性,温度等。而android中所有传感器都要依赖于android.hardware.SensorEventListener接口,那么我们现在来看看sdk里面是怎么写的:

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

这个接口其实简单,只有两个方法,从字面上看我们也能知道,当传感器发生变化的时候,会调用onSensorChanged这个方法,所以重点在于理解这个方法,然后我就来看看它传入的参数SensorEvent event,继续查看关于 SensorEvent 的sdk,不难发现SensorEvent 有4个属性:

public int accuracy、public Sensor、public long timestamp、public final float[ ] values

而全文大部分篇幅都是用来描述values这个属性,因为values是用来描述传感器的值,关于这个values我以前在网上找到了相关资料,虽然我已经不记得那位大神的ID了,但是还是谢谢他能分享这些。

在方向传感器中values变量的3个值都表示度数,它们的含义如下:

values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘。
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之间变化。


在加速传感器中,values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values[0]为负值;从右向左移动,values[0]为正值。


在重力传感器中,重力传感器与加速度传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。


在光线传感器中,alues数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f。


在陀螺仪传感器中,陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values[0]:延X轴旋转的角速度。values[1]:延Y轴旋转的角速度。values[2]:延Z轴旋转的角速度。当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。


介绍完基本的传感器类型后,我们开始尝试编写的我们的第一个传感器。具体思路如下:

1、实例化传感器借口

2、获得传感器管理接口

3、注册传感器


public class MainActivity 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)      {      }  }  

由于这个例子过于简单,代码也是网上找的教学代码,所以demo我就不写了,今天就先给大家介绍下传感器的原理,下次我们就开始进阶使用传感器,介绍个我以前做的计步器app,希望大家能喜欢,敬请下回分解。

更多相关文章

  1. Android获取不同手机 自身存储和外置SD卡存储路径的解决方案
  2. 局域网内android设备发现及通讯
  3. Android开发的第一个例子(内附Sdk、Android(安卓)studio的下载)
  4. android安全问题(一) 静音拍照与被拍
  5. android调用webservice实现手机归属查询
  6. Android重力感应器入门介绍
  7. 谷安: HTC Android(安卓)智能手机将率先内建景德镇银联支付功能.
  8. Google 受罚后将向 Android(安卓)手机制造商收费:每款设备最高 40
  9. 手机服务器Android消息推送(二)--基于MQTT协议实现的推送功能

随机推荐

  1. Activity的启动模式
  2. Android中的控件
  3. Android(安卓)Handler机制理解
  4. Android(安卓)滑动手势侦测方法介绍
  5. win7下修改AVD默认路径
  6. Android工程中R.java文件的重新生成——
  7. RK3399: 支持wifi/4g与以太网共存
  8. Android事件分发之dispatchTouchEvent()
  9. [Android]自定义Button之drawableLeft居
  10. Android微信登录(shareSDK)注意事项