Skip to content

Instantly share code, notes, and snippets.

@oa414
Created March 11, 2013 12:05
Show Gist options
  • Select an option

  • Save oa414/5133791 to your computer and use it in GitHub Desktop.

Select an option

Save oa414/5133791 to your computer and use it in GitHub Desktop.
侦测Android加速度传感器
package com.example.AdmobTest;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
import android.widget.TextView;
import java.util.Random;
/**
* Created with IntelliJ IDEA.
* User: linxiangyu
* Date: 13-3-11
* Time: 下午7:24
* To change this template use File | Settings | File Templates.
*/
public abstract class ShakeListener implements SensorEventListener {
/**
*
* Usage:
* new ShakeListener(this){
* @Override
* void update() {
* Toast.makeText(MyActivity.this, "shake detected w/ speed: " + mSpeed, Toast.LENGTH_SHORT).show();
* }
* }.init();
*
*/
SensorManager mSensorMgr ;
Context context;
private int SHAKE_THRESHOLD = 6000; //摇动力度
private int LISTENER_TIME_GAP = 50; // 检测时间间隔,单位ms
long lastUpdate,lastShakeTime = 0;
float x,y,z, last_x = 0,last_y, last_z = 0;
float mSpeed;
protected ShakeListener(Context context) {
this.context = context;
}
public void init(){
//初始化SensorManager
mSensorMgr = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
}
public void init(int SENSOR_DELAY_TYPE){
/**
* in SensorMananger class:
*
* int SENSOR_DELAY_FASTEST get sensor data as fast as possible
* int SENSOR_DELAY_GAME rate suitable for games
* int SENSOR_DELAY_NORMAL rate (default) suitable for screen orientation changes
* int SENSOR_DELAY_UI rate suitable for the user interface
*/
mSensorMgr = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SENSOR_DELAY_TYPE);
}
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
if ((curTime - lastUpdate) > LISTENER_TIME_GAP) {
long diffTime = (curTime - lastUpdate);
lastUpdate = curTime;
x = values[SensorManager.DATA_X];
y = values[SensorManager.DATA_Y];
z = values[SensorManager.DATA_Z];
//计算摇动的速度
float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;
mSpeed = speed;
if (speed > SHAKE_THRESHOLD) {
Log.d("sensor", "shake detected w/ speed: " + speed);
// Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show();
update();
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
abstract void update();
public void setListenTimeGap(int LISTENER_TIME_GAP) {
this.LISTENER_TIME_GAP = LISTENER_TIME_GAP;
}
public void setShakeThreshold(int SHAKE_THRESHOLD) {
this.SHAKE_THRESHOLD = SHAKE_THRESHOLD;
}
public SensorManager getmSensorManager() {
return mSensorMgr;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment