Android加速度传感器实现“摇一摇”,带手机振动
- 由于代码有点多,所以就分开写了,注释还算详细,方便学习
Activitypackage 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;@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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() {@Overridepublic 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的指定下标开始重复}@Overrideprotected 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();}}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。