声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1787|回复: 0

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

[复制链接]
发表于 2016-4-8 10:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 久病成欢 于 2016-4-8 10:54 编辑

  Activity
  1.   [java] view plain copypackage com.lmw.android.test;

  2.   import android.app.Activity;

  3.   import android.os.Bundle;

  4.   import android.os.Handler;

  5.   import android.os.Vibrator;

  6.   import android.view.View;

  7.   import android.widget.Toast;

  8.   import com.lmw.android.test.ShakeListener.OnShakeListener;

  9.   public class ShakeActivity extends Activity {

  10.   ShakeListener mShakeListener = null;

  11.   Vibrator mVibrator;

  12.   @Override

  13.   public void onCreate(Bundle savedInstanceState) {

  14.   // TODO Auto-generated method stub

  15.   super.onCreate(savedInstanceState);

  16.   setContentView(R.layout.shake);

  17.   // drawerSet ();//设置 drawer监听 切换 按钮的方向

  18.   //获得振动器服务

  19.   mVibrator = (Vibrator) getApplication().getSystemService(VIBRATOR_SERVICE);

  20.   //实例化加速度传感器检测类

  21.   mShakeListener = new ShakeListener(ShakeActivity.this);

  22.   mShakeListener.setOnShakeListener(new OnShakeListener() {

  23.   public void onShake() {

  24.   mShakeListener.stop();

  25.   startVibrato(); // 开始 震动

  26.   new Handler().postDelayed(new Runnable() {

  27.   @Override

  28.   public void run() {

  29.   Toast mtoast;

  30.   mtoast = Toast.makeText(ShakeActivity.this,

  31.   "呵呵,成功了!。\n再试一次吧!", 1000);

  32.   mtoast.show();

  33.   mVibrator.cancel();

  34.   mShakeListener.start();

  35.   }

  36.   }, 2000);

  37.   }

  38.   });

  39.   }

  40.   // 定义震动

  41.   public void startVibrato() {

  42.   mVibrator.vibrate(new long[] { 500, 200, 500, 200 }, -1);

  43.   // 第一个{}里面是节奏数组,

  44.   // 第二个参数是重复次数,-1为不重复,非-1则从pattern的指定下标开始重复

  45.   }

  46.   @Override

  47.   protected void onDestroy() {

  48.   super.onDestroy();

  49.   if (mShakeListener != null) {

  50.   mShakeListener.stop();

  51.   }

  52.   }

  53.   }
复制代码


  ShakeListener
  1.   [java] view plain copy/**

  2.   * 一个检测手机摇晃的监听器

  3.   * 加速度传感器

  4.   * values[0]: x-axis 方向加速度

  5.   * values[1]: y-axis 方向加速度

  6.   * values[2]: z-axis 方向加速度

  7.   */

  8.   public class ShakeListener implements SensorEventListener {

  9.   // 速度的阈值,当摇晃速度达到这值后产生作用

  10.   private static final int SPEED_SHRESHOLD = 3000;

  11.   // 两次检测的时间间隔

  12.   private static final int UPTATE_INTERVAL_TIME = 70;

  13.   // 传感器管理器

  14.   private SensorManager sensorManager;

  15.   // 传感器

  16.   private Sensor sensor;

  17.   // 重力感应监听器

  18.   private OnShakeListener onShakeListener;

  19.   // 上下文

  20.   private Context mContext;

  21.   // 手机上一个位置时重力感应坐标

  22.   private float lastX;

  23.   private float lastY;

  24.   private float lastZ;

  25.   // 上次检测时间

  26.   private long lastUpdateTime;

  27.   // 构造器

  28.   public ShakeListener(Context c) {

  29.   // 获得监听对象

  30.   mContext = c;

  31.   start();

  32.   }

  33.   // 开始

  34.   public void start() {

  35.   // 获得传感器管理器

  36.   sensorManager = (SensorManager) mContext

  37.   .getSystemService(Context.SENSOR_SERVICE);

  38.   if (sensorManager != null) {

  39.   // 获得重力传感器

  40.   sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

  41.   }

  42.   // 注册

  43.   if (sensor != null) {

  44.   //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,

  45.   //根据不同应用,需要的反应速率不同,具体根据实际情况设定

  46.   sensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL);

  47.   }

  48.   }

  49.   // 停止检测

  50.   public void stop() {

  51.   sensorManager.unregisterListener(this);

  52.   }

  53.   // 设置重力感应监听器

  54.   public void setOnShakeListener(OnShakeListener listener) {

  55.   onShakeListener = listener;

  56.   }

  57.   // 重力感应器感应获得变化数据

  58.   public void onSensorChanged(SensorEvent event) {

  59.   // 现在检测时间

  60.   long currentUpdateTime = System.currentTimeMillis();

  61.   // 两次检测的时间间隔

  62.   long timeInterval = currentUpdateTime - lastUpdateTime;

  63.   // 判断是否达到了检测时间间隔

  64.   if (timeInterval < UPTATE_INTERVAL_TIME)

  65.   return;

  66.   // 现在的时间变成last时间

  67.   lastUpdateTime = currentUpdateTime;

  68.   // 获得x,y,z坐标

  69.   float x = event.values[0];

  70.   float y = event.values[1];

  71.   float z = event.values[2];

  72.   // 获得x,y,z的变化值

  73.   float deltaX = x - lastX;

  74.   float deltaY = y - lastY;

  75.   float deltaZ = z - lastZ;

  76.   // 将现在的坐标变成last坐标

  77.   lastX = x;

  78.   lastY = y;

  79.   lastZ = z;

  80.   double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ* deltaZ)/ timeInterval * 10000;

  81.   // 达到速度阀值,发出提示

  82.   if (speed >= SPEED_SHRESHOLD) {

  83.   onShakeListener.onShake();

  84.   }

  85.   }

  86.   //当传感器精度改变时回调该方法

  87.   public void onAccuracyChanged(Sensor sensor, int accuracy) {

  88.   }

  89.   // 摇晃监听接口

  90.   public interface OnShakeListener {

  91.   public void onShake();

  92.   }

  93.   }
复制代码

转自:http://blog.csdn.net/onlyonecoder/article/details/8477072

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-3 03:30 , Processed in 0.101342 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表