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