android传感器摇一摇功能

现在的不少应用都用到了摇动手机改变内容的功能,比如微信中的“摇一摇”功能。前两天要实现这个功能,稍微看了一下关于传感器Sensor的内容。
传感器有几种类型:
       方向传感器:   Sensor.TYPE_ORIENTATION
       加速度(重力)传感器: Sensor.TYPE_ACCELEROMETER
       光线传感器:    Sensor.TYPE_LIGHT
       磁场传感器:   Sensor.TYPE_MAGNETIC_FIELD
       距离(临近性)传感器: Sensor.TYPE_PROXIMITY
       温度传感器:   Sensor.TYPE_TEMPERATURE
在摇动手机的功能中,我们只用加速度传感器就行了~~

加速度传感器返回值的单位是加速度的单位 m/s^2(米每二次方秒),有三个方向的值分别是
  values[0]: x-axis 方向加速度
  values[1]: y-axis 方向加速度
  values[2]: z-axis 方向加速度
  其中x,y,z方向的定义是以水平放置在的手机的右下脚为参照系坐标原点
  x 方向就是手机的水平方向,右为正
  y 方向就是手机的水平垂直方向,前为正
  y 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负
所以说,你的手机放置的空间位置不同,它三个方向的加速度也不同。在这里,三个方向的加速度,与我们传统意义上的加速度(9.8m/s2)有所区别,需细细品味。
以下是摇动手机后清除TextView的文字的代码:

[java]  view plain copy
  1. package gy.lovers;  
  2.    
  3.   
  4. import java.util.ArrayList;  
  5.    
  6. import java.util.List;  
  7.    
  8. import java.util.Random;  
  9.    
  10.   
  11. import android.app.Activity;  
  12.    
  13. import android.app.Service;  
  14.    
  15. import android.content.res.Resources;  
  16.    
  17. import android.hardware.Sensor;  
  18.    
  19. import android.hardware.SensorEvent;  
  20.    
  21. import android.hardware.SensorEventListener;  
  22.    
  23. import android.hardware.SensorManager;  
  24.    
  25. import android.os.Bundle;  
  26.    
  27. import android.os.Vibrator;  
  28.    
  29. import android.view.View;  
  30.    
  31. import android.widget.Button;  
  32.    
  33.   
  34. //需要实现SensorEventListener接口  
  35.    
  36. public class LoversChoise extends Activity implements SensorEventListener{  
  37.    
  38.           
  39.    
  40.         Button clear;  
  41.    
  42.   
  43.         //定义sensor管理器  
  44.    
  45.     private SensorManager mSensorManager;  
  46.    
  47.     //震动  
  48.    
  49.     private Vibrator vibrator;  
  50.    
  51.       
  52.          public void onCreate(Bundle savedInstanceState) {  
  53.    
  54.                 super.onCreate(savedInstanceState);  
  55.    
  56.                 setContentView(R.layout.loverschoise);  
  57.    
  58.                   
  59.               //获取传感器管理服务  
  60.    
  61.                 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
  62.    
  63.                 //震动  
  64.    
  65.                 vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);  
  66.    
  67.                   
  68.                clear = (Button) findViewById(R.id.clear);  
  69.    
  70.   
  71.                clear.setOnClickListener(new Button.OnClickListener(){  
  72.    
  73.                @Override  
  74.    
  75.                 public void onClick(View arg0) {  
  76.    
  77.                  // TODO Auto-generated method stub  
  78.    
  79.     
  80.    
  81.                 //点击button后,给button按钮设置了text  
  82.    
  83.               clear.setText("现在给button的text赋值喽~");  
  84.    
  85.   
  86.         });  
  87.    
  88.   
  89. @Override  
  90.    
  91. protected void onResume(){  
  92.    
  93.   super.onResume();  
  94.    
  95.   
  96.   //加速度传感器  
  97.    
  98.   mSensorManager.registerListener(this,   
  99.   mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),   
  100.   //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,  
  101.    
  102.   //根据不同应用,需要的反应速率不同,具体根据实际情况设定  
  103.    
  104.   SensorManager.SENSOR_DELAY_NORMAL);  
  105.    
  106. }  
  107.    
  108.   
  109. @Override  
  110.    
  111. protected void onStop(){  
  112.    
  113.   mSensorManager.unregisterListener(this);  
  114.    
  115.   super.onStop();  
  116.    
  117. }  
  118.    
  119.   
  120. @Override  
  121.    
  122. protected void onPause(){  
  123.    
  124.   mSensorManager.unregisterListener(this);  
  125.    
  126.   super.onPause();  
  127.    
  128. }  
  129.    
  130.   
  131. @Override  
  132.    
  133. public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  134.    
  135.   // TODO Auto-generated method stub  
  136.    
  137.   //当传感器精度改变时回调该方法,Do nothing.  
  138.    
  139. }  
  140.    
  141. @Override  
  142.    
  143. public void onSensorChanged(SensorEvent event) {  
  144.    
  145.   // TODO Auto-generated method stub  
  146.    
  147.   int sensorType = event.sensor.getType();  
  148.    
  149.     
  150.    
  151.   //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
  152.    
  153.   float[] values = event.values;  
  154.    
  155.     
  156.    
  157.   if(sensorType == Sensor.TYPE_ACCELEROMETER){  
  158.    
  159.     
  160.    
  161.   /*因为一般正常情况下,任意轴数值最大就在9.8~10之间,只有在你突然摇动手机 
  162.   
  163.   *的时候,瞬时加速度才会突然增大或减少。 
  164.   
  165.   *所以,经过实际测试,只需监听任一轴的加速度大于14的时候,改变你需要的设置 
  166.   
  167.   *就OK了~~~ 
  168.   
  169.   */  
  170.    
  171.    if((Math.abs(values[0])>14||Math.abs(values[1])>14||Math.abs(values[2])>14)){  
  172.    
  173.      
  174.    
  175.     //摇动手机后,设置button上显示的字为空  
  176.    
  177.     clear.setText(null);  
  178.    
  179.       
  180.     //摇动手机后,再伴随震动提示~~  
  181.    
  182.     vibrator.vibrate(500);  
  183.    
  184.      
  185.    
  186.    }  
  187.    
  188.   }  
  189.    
  190. }  
  191.    
  192.   
  193. }  

你可能感兴趣的:(android传感器)