您的位置:首页 > 移动开发 > Android开发

Android 手机摇晃监听

2016-03-16 14:44 931 查看
转至:http://gundumw100.iteye.com/blog/1472889

http://blog.csdn.net/xfks555/article/details/6703464 

Java代码  


import android.content.Context;  

import android.hardware.Sensor;  

import android.hardware.SensorEvent;  

import android.hardware.SensorEventListener;  

import android.hardware.SensorManager;  

  

/** 

 *  

 * 一个检测手机摇晃的监听器 

 * @author fuzhengchao 

 * 

 */  

public class ShakeListener implements SensorEventListener {  

 //速度阈值,当摇晃速度达到这值后产生作用  

 private static final int SPEED_SHRESHOLD = 4000;  

 //两次检测的时间间隔  

 private static final int UPTATE_INTERVAL_TIME = 70;  

   

 //传感器管理器  

 private SensorManager sensorManager;  

 //传感器  

 private Sensor sensor;  

 //重力感应监听器  

 private OnShakeListener onShakeListener;  

 //上下文  

 private Context context;  

 //手机上一个位置时重力感应坐标  

 private float lastX;  

 private float lastY;  

 private float lastZ;  

   

 //上次检测时间  

 private long lastUpdateTime;  

  

 //构造器  

 public ShakeListener(Context c) {  

  //获得监听对象  

  context = c;  

  start();  

 }  

   

 //开始  

 public void start() {  

  //获得传感器管理器  

  sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);   

  if(sensorManager != null) {  

   //获得重力传感器  

   sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  

  }  

  //注册  

  if(sensor != null) {  

   sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);  

  }  

    

 }  

   

 //停止检测  

 public void stop() {  

  sensorManager.unregisterListener(this);  

 }  

   

 //摇晃监听接口  

 public interface OnShakeListener {  

  public void onShake();  

 }  

   

 //设置重力感应监听器  

 public void setOnShakeListener(OnShakeListener listener) {  

  onShakeListener = listener;  

 }  

   

   

 //重力感应器感应获得变化数据  

 public void onSensorChanged(SensorEvent event) {  

  //现在检测时间  

  long currentUpdateTime = System.currentTimeMillis();  

  //两次检测的时间间隔  

  long timeInterval = currentUpdateTime - lastUpdateTime;    

  //判断是否达到了检测时间间隔  

  if(timeInterval < UPTATE_INTERVAL_TIME)   

   return;  

  //现在的时间变成last时间  

  lastUpdateTime = currentUpdateTime;  

    

  //获得x,y,z坐标  

  float x = event.values[0];  

  float y = event.values[1];  

  float z = event.values[2];  

    

  //获得x,y,z的变化值  

  float deltaX = x - lastX;  

  float deltaY = y - lastY;  

  float deltaZ = z - lastZ;  

    

  //将现在的坐标变成last坐标  

  lastX = x;  

  lastY = y;  

  lastZ = z;  

    

  double speed = Math.sqrt(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ)/timeInterval * 10000;  

  //达到速度阀值,发出提示  

  if(speed >= SPEED_SHRESHOLD)  

   onShakeListener.onShake();  

 }  

   

 public void onAccuracyChanged(Sensor sensor, int accuracy) {  

    

 }  

  

}  

用法: 

Java代码  


ShakeListener shakeListener = new ShakeListener(this);//创建一个对象  

shakeListener.setOnShakeListener(new OnShakeListener(){//调用setOnShakeListener方法进行监听  

  

public void onShake() {  

    //对手机摇晃后的处理(如换歌曲,换图片,震动……)  

    //onVibrator();  

}  

  

});  

//震动 

Java代码  


private void onVibrator() {  

  Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);  

  if (vibrator == null) {  

   Vibrator localVibrator = (Vibrator) context.getApplicationContext()  

     .getSystemService("vibrator");  

   vibrator = localVibrator;  

  }  

  vibrator.vibrate(100L);  

 }  

摇一摇精简代码实现 
http://blog.sina.com.cn/s/blog_66cfbaa5010120w8.html 

Android中类似于奇虎360手机卫士中摇一摇效果实现 
http://blog.csdn.net/nono_love_lilith/article/details/7554341
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: