Last active
July 12, 2016 06:17
-
-
Save hiwanz/6061986 to your computer and use it in GitHub Desktop.
手机摇一摇类,调用代码: ShakeListener shakeListener = new ShakeListener(this); shakeListener.setOnShakeListener(new ShakeListener.OnShakeListener() { //调用setOnShakeListener方法进行监听,摇晃手机输出信息 public void onShake() { Log.v("debuginfo","shakeing"); } });
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 { | |
//速度阈值,当摇晃速度达到这值后产生作用 | |
private static final int SPEED_SHRESHOLD = 2500; | |
//两次检测的时间间隔 | |
private static final int UPTATE_INTERVAL_TIME = 100; | |
//传感器管理器 | |
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) { | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment