Android加速度传感器实现“摇一摇”,带手机振动

mac2022-06-30  70

Activity

[java] view plain copy 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[] { 500200500200 }, -1);          // 第一个{}里面是节奏数组,          // 第二个参数是重复次数,-1为不重复,非-1则从pattern的指定下标开始重复      }        @Override      protected void onDestroy() {          super.onDestroy();          if (mShakeListener != null) {              mShakeListener.stop();          }      }  }  

ShakeListener

[java] view plain copy /**  * 一个检测手机摇晃的监听器  * 加速度传感器  * 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();      }    } 

转载于:https://www.cnblogs.com/tianshidechibang234/p/3441166.html

相关资源:android震动传感器之摇一摇
最新回复(0)