您的位置:首页 > 其它

监听手机晃动(摇一摇)SensorEventListener

2015-08-20 14:21 302 查看
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手机卫士中摇一摇效果实现
/article/1654101.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: