[置顶] Android 实现类似摇一摇功能

以前做的一个小应用里面有摇一摇功能,有必要写下来做个笔记。

摇一摇功能主要用到加速度传感器Sensor.TYPE_ACCELEROMETER

摇一摇功能主要是监听手机加速度变化,当超过设定的某一值时,即触发事件


一、简单的一个示例

下给出一段简单的实现代码:

功能:原先textview1显示为“初始文本”, 当摇晃之后,textview1变为”摇一摇成功!!!“并伴随震动(点击按钮可回到”初始文本“)。

[java]  view plain copy
  1. public class SensorTestActivity extends Activity implements SensorEventListener  
  2. {  
  3.     TextView tv = null;  
  4.     Button button = null;  
  5.     SensorManager sensorManager = null;  
  6.     Vibrator vibrator = null;  
  7.   
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState)  
  10.     {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.   
  14.         button = (Button) findViewById(R.id.button1);  
  15.         tv = (TextView) findViewById(R.id.textview1);  
  16.         button.setOnClickListener(new View.OnClickListener()  
  17.         {  
  18.   
  19.             @Override  
  20.             public void onClick(View v)  
  21.             {  
  22.                 tv.setText("初始文本");  
  23.             }  
  24.         });  
  25.   
  26.         sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
  27.         vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);  
  28.   
  29.     }  
  30.   
  31.     @Override  
  32.     protected void onPause()  
  33.     {  
  34.         super.onPause();  
  35.         sensorManager.unregisterListener(this);  
  36.     }  
  37.   
  38.     @Override  
  39.     protected void onResume()  
  40.     {  
  41.         super.onResume();  
  42.         sensorManager.registerListener(this,  
  43.                 sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
  44.                 SensorManager.SENSOR_DELAY_NORMAL);  
  45.     }  
  46.   
  47.     @Override  
  48.     public void onAccuracyChanged(Sensor sensor, int accuracy)  
  49.     {  
  50.         //当传感器精度改变时回调该方法,Do nothing.  
  51.     }  
  52.   
  53.     @Override  
  54.     public void onSensorChanged(SensorEvent event)  
  55.     {  
  56.   
  57.         int sensorType = event.sensor.getType();  
  58.         //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
  59.         float[] values = event.values;  
  60.         if (sensorType == Sensor.TYPE_ACCELEROMETER)  
  61.         {  
  62.             if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math  
  63.                     .abs(values[2]) > 17))  
  64.             {  
  65.                 Log.d("sensor x ""============ values[0] = " + values[0]);  
  66.                 Log.d("sensor y ""============ values[1] = " + values[1]);  
  67.                 Log.d("sensor z ""============ values[2] = " + values[2]);  
  68.                 tv.setText("摇一摇成功!!!");  
  69.                 //摇动手机后,再伴随震动提示~~  
  70.                 vibrator.vibrate(500);  
  71.             }  
  72.   
  73.         }  
  74.     }  
  75.   
  76. }  

二、更加灵活一点的写法

可以将监听部分注册部分分开,这样的好处就是实现监听的代码复用

以下贴几段以前的几段代码。

1. 监听部分

[java]  view plain copy
  1. public class ShakeListenerUtils implements SensorEventListener  
  2. {  
  3.     private Activity context;  
  4.   
  5.     public ShakeListenerUtils(Activity context)  
  6.     {  
  7.         super();  
  8.         this.context = context;  
  9.     }  
  10.   
  11.     @Override  
  12.     public void onSensorChanged(SensorEvent event)  
  13.     {  
  14.         int sensorType = event.sensor.getType();  
  15.         //values[0]:X轴,values[1]:Y轴,values[2]:Z轴    
  16.         float[] values = event.values;  
  17.   
  18.         if (sensorType == Sensor.TYPE_ACCELEROMETER)  
  19.         {  
  20.   
  21.             /*正常情况下,任意轴数值最大就在9.8~10之间,只有在突然摇动手机  
  22.               的时候,瞬时加速度才会突然增大或减少。   监听任一轴的加速度大于17即可 
  23.             */  
  24.             if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math  
  25.                     .abs(values[2]) > 17))  
  26.             {  
  27.                 context.overridePendingTransition(R.anim.zoom_out_enter,  
  28.                         R.anim.zoom_out_exit);  
  29.                 //检测到晃动后启动OpenDoor效果  
  30.                 Intent intent = new Intent(context, OpenDoorActivity.class);  
  31.                 context.startActivity(intent);  
  32.                 context.finish();  
  33.             }  
  34.         }  
  35.     }  
  36.   
  37.     @Override  
  38.     public void onAccuracyChanged(Sensor sensor, int accuracy)  
  39.     {  
  40.         //当传感器精度改变时回调该方法,Do nothing.   
  41.     }  
  42.   
  43. }  

2. 注册部分

[java]  view plain copy
  1. public class ShakeILikeActivity extends Activity  
  2. {  
  3.   
  4.     private ShakeListenerUtils shakeUtils;  
  5.     private SensorManager mSensorManager; //定义sensor管理器, 注册监听器用  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState)  
  9.     {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.activity_shake_i_like);  
  12.   
  13.         shakeUtils = new ShakeListenerUtils(this);  
  14.     }  
  15.   
  16.     @Override  
  17.     protected void onResume()  
  18.     {  
  19.         super.onResume();  
  20.   
  21.         //获取传感器管理服务   
  22.         mSensorManager = (SensorManager) this  
  23.                 .getSystemService(Service.SENSOR_SERVICE);  
  24.         //加速度传感器    
  25.         mSensorManager.registerListener(shakeUtils,  
  26.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
  27.                 //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,    
  28.                 //根据不同应用,需要的反应速率不同,具体根据实际情况设定    
  29.                 SensorManager.SENSOR_DELAY_NORMAL);  
  30.     }  
  31.   
  32.     @Override  
  33.     protected void onPause()  
  34.     {  
  35.         mSensorManager.unregisterListener(shakeUtils);  
  36.         this.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);//回退时闪一下  
  37.         super.onPause();  
  38.     }  
  39.   
  40. }  
       另外需要添加权限: <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
     这篇转载的博文,有一个问题就是用TextView时,会使手机挂掉,后来我用EditText代替,才有用,建议大家用这个,否则会遇到莫名其妙的问题。

转载请注明出处:http://blog.csdn.net/xn4545945  

你可能感兴趣的:(android,微信,摇一摇)