题记:许多小伙伴都叫我写个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,希望大家能喜欢,敬请下回分解。