zoukankan      html  css  js  c++  java
  • Android加速度传感器实现“摇一摇”,带手机振动

    由于代码有点多,所以就分开写了,注释还算详细,方便学习
    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,
    "呵呵,成功了!。 再试一次吧!", 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();
    }
     
    }
     
  • 相关阅读:
    phpExcel中文帮助手册之常用功能指南
    linux下使用远程图形界面
    分支限界法 0-1背包问题-优先队列式
    分支限界法 0-1背包问题-队列式
    回溯法 0-1背包问题
    贪心算法 哈夫曼树编码
    贪心算法 二.活动安排问题
    贪心算法 一.部分背包问题
    动态规划 四.0-1背包问题
    动态规划 三.最大子段和
  • 原文地址:https://www.cnblogs.com/xgjblog/p/4067306.html
Copyright © 2011-2022 走看看