由于代码有点多,所以就分开写了,注释还算详细,方便学习
Activity
package com.lmw.android.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.view.View;
import android.widget.Toast;
import com.lmw.android.test.ShakeListener.OnShakeListener;
public class ShakeActivity extends Activity {
ShakeListener mShakeListener = null;
Vibrator mVibrator;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.shake);
// drawerSet ();//设置 drawer监听 切换 按钮的方向
//获得振动器服务
mVibrator = (Vibrator) getApplication().getSystemService(VIBRATOR_SERVICE);
//实例化加速度传感器检测类
mShakeListener = new ShakeListener(ShakeActivity.this);
mShakeListener.setOnShakeListener(new OnShakeListener() {
public void onShake() {
mShakeListener.stop();
startVibrato(); // 开始 震动
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Toast mtoast;
mtoast = Toast.makeText(ShakeActivity.this,
"呵呵,成功了!。\n再试一次吧!", 1000);
mtoast.show();
mVibrator.cancel();
mShakeListener.start();
}
}, 2000);
}
});
}
// 定义震动
public void startVibrato() {
mVibrator.vibrate(new long[] { 500, 200, 500, 200 }, -1);
// 第一个{}里面是节奏数组,
// 第二个参数是重复次数,-1为不重复,非-1则从pattern的指定下标开始重复
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mShakeListener != null) {
mShakeListener.stop();
}
}
}
ShakeListener
/**
* 一个检测手机摇晃的监听器
* 加速度传感器
* values[0]: x-axis 方向加速度
* values[1]: y-axis 方向加速度
* values[2]: z-axis 方向加速度
*/
public class ShakeListener implements SensorEventListener {
// 速度的阈值,当摇晃速度达到这值后产生作用
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) {
//还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,
//根据不同应用,需要的反应速率不同,具体根据实际情况设定
sensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL);
}
}
// 停止检测
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();
}
}
分享到:
相关推荐
利用android传感器实现手机摇一摇解除闹铃,让你不再继续赖床
加速度传感器是最常见的传感器,大部分Android手机都内置了加速度传感器,加速度传感器运用最广泛的功能就是微信的摇一摇功能,用户通过摇晃手机寻找周围的人,其它类似的应用还摇骰子、玩游戏等。
该demo实现了 三个传感器数据获取,显示在同一个activity中,并且每隔一秒刷新数据。方便对比,学习。
Android加速度传感器,记录数据保存成文本。
利用java实现调用安卓加速度传感器,并显示X,Y,Z三个方向实时加速度的数值,内附源码和生成的.apk文件,可直接使用,代码均有注释,易于理解
主要介绍了Android编程使用加速度传感器实现摇一摇功能及优化的方法,结合实例形式分析了Android传感器的调用方法、参数含义及具体使用技巧,需要的朋友可以参考下
Android 传感器(Sensor)API教程 (六) 加速度传感器运用实例 Android 传感器(Sensor)API教程 (六) 加速度传感器运用实例
Android传感器应用之摇一摇小球运动实现 看代码吧
Android加速度传感器源代码
android 加速度传感器,重力传感器,线性加速度传感器.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Android 项目源码利用加速度传感器实现计步
利用android设备的加速度和震动传感器开发的一个摇一摇小项目。
Android源码手机加速度传感器 测试
手机摇一摇DEMO代码,实现摇一摇执行特定程序.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Android高级应用源码-Android加速度传感器源代码.rar
Android 加速度传感器的类型是 Sensor.TYPE_ACCELEROMETER 通过 android.hardware.SensorEvent 返回加速度传感器值。
本例子是一个测试手机加速度传感器的例子,实现了手机加速度的检测,会根据手机不同的加速度阀值来判断当前手机的状态,如果晃动幅度就会,例子里定义了加速度范围,分别是最佳舒适性、良好舒适性、中等舒适性、不好...
Android项目源码利用加速度传感器实现计步