核心接口代码:
- import android.content.Context;
- import android.hardware.Sensor;
- import android.hardware.SensorEvent;
- import android.hardware.SensorEventListener;
- import android.hardware.SensorManager;
- public class ShakeListener implements SensorEventListener {
- String TAG = "ShakeListener";
- // 速度阈值,当摇晃速度达到这值后产生作用
- private static final int SPEED_SHRESHOLD = 3000;
- // 两次检测的时间间隔
- private static final int UPTATE_INTERVAL_TIME = 70;
- // 传感器管理器
- private SensorManager sensorManager;
- // 传感器
- private Sensor sensor;
- // 重力感应监听器
- private OnShakeListener onShakeListener;
- // 上下文
- private Context mContext;
- // 手机上一个位置时重力感应坐标
- private float lastX;
- private float lastY;
- private float lastZ;
- // 上次检测时间
- private long lastUpdateTime;
- // 构造器
- public ShakeListener(Context c) {
- // 获得监听对象
- mContext = c;
- start();
- }
- // 开始
- public void start() {
- // 获得传感器管理器
- sensorManager = (SensorManager) mContext
- .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 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) {
- }
- // 摇晃监听接口
- public interface OnShakeListener {
- public void onShake();
- }
- }
package com.novasky.utils;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class ShakeListener implements SensorEventListener {
String TAG = "ShakeListener";
// 速度阈值,当摇晃速度达到这值后产生作用
private static final int SPEED_SHRESHOLD = 3000;
// 两次检测的时间间隔
private static final int UPTATE_INTERVAL_TIME = 70;
// 传感器管理器
private SensorManager sensorManager;
// 传感器
private Sensor sensor;
// 重力感应监听器
private OnShakeListener onShakeListener;
// 上下文
private Context mContext;
// 手机上一个位置时重力感应坐标
private float lastX;
private float lastY;
private float lastZ;
// 上次检测时间
private long lastUpdateTime;
// 构造器
public ShakeListener(Context c) {
// 获得监听对象
mContext = c;
start();
}
// 开始
public void start() {
// 获得传感器管理器
sensorManager = (SensorManager) mContext
.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 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) {
}
// 摇晃监听接口
public interface OnShakeListener {
public void onShake();
}
}
应用代码:
- public class yaoAcitivity extends Activity {
- ShakeListener mShakeListener = null;
- private TextView tv;
- private ImageView iv;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.main);
- tv=(TextView)this.findViewById(R.id.textView1);
- iv=(ImageView)this.findViewById(R.id.imageView1);
- mShakeListener = new ShakeListener(this);
- mShakeListener.setOnShakeListener(new shakeLitener());
- }
- private class shakeLitener implements OnShakeListener{
- @Override
- public void onShake() {
- // TODO Auto-generated method stub
- tv.setText("摇一摇成功啦!");
- iv.setImageResource(R.drawable.attitude_laugh);
- mShakeListener.stop();
- }
- }
- }