zoukankan      html  css  js  c++  java
  • android 晃动

    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.util.Log;

    public class SensorGet implements SensorEventListener {
    public static final int TYPE_HUANDONG = 1;
    // 这个控制精度,越小表示反应越灵敏
    public int linmin = 500;

    private Context mContext;

    public SensorGet(Context c, OnSensor onSensor) {
    mContext = c;
    this.onSensor = onSensor;
    sm = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
    }

    /*********
    * Sensor 说明 Sensor.TYPE_ACCELEROMETER 加速度感应检测 Sensor.TYPE_MAGNETIC_FIELD
    * 磁场感应检测 Sensor.TYPE_ORIENTATION 方位感应检测 Sensor.TYPE_GYROSCOPE 回转仪感应检测
    * Sensor.TYPE_LIGHT 亮度感应检测 Sensor.TYPE_PRESSURE 压力感应检测
    * Sensor.TYPE_TEMPERATURE 温度感应检测 Sensor.TYPE_PROXIMITY 接近感应检测
    *********
    */

    /*
    * SENSOR_DELAY_FASTEST
    * 最低延迟,一般不是特别敏感的处理不推荐使用,该种模式可能造成手机电力大量消耗,由于传递的为原始数据,算法不处理好将会影响游戏逻辑和UI的性能
    * ,所以Android开发网不推荐大家使用。 SENSOR_DELAY_GAME 游戏延迟,一般绝大多数的实时性较高的游戏都使用该级别 int
    * SENSOR_DELAY_NORMAL 标准延迟,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象。
    * int SENSOR_DELAY_UI 用户界面延迟,一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中我们不使用。
    */
    private SensorManager sm;

    public void register() {
    sm.registerListener(this,
    sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
    SensorManager.SENSOR_DELAY_GAME);
    }

    public void unRegister() {

    sm.unregisterListener(this);
    mLastX=-1.0f;
    mLastY=-1.0f;
    mLastZ=-1.0f;
    mLastTime=0;
    mShakeCount = 0;
    mLastShake=0;
    mLastForce=0;
    }




    @Override
    public void onSensorChanged(SensorEvent event) {

    acceB(event);
    }

    private OnSensor onSensor;

    public interface OnSensor {
    public void onSensor();
    }


    private static final int FORCE_THRESHOLD = 2500;
    private static final int TIME_THRESHOLD = 100;
    private static final int SHAKE_TIMEOUT = 500;
    private static final int SHAKE_DURATION = 1000;
    private static final int SHAKE_COUNT = 1;

    private float mLastX=-1.0f, mLastY=-1.0f, mLastZ=-1.0f;
    private long mLastTime;
    private int mShakeCount = 0;
    private long mLastShake;
    private long mLastForce;


    private void acceB(SensorEvent event)
    {
    onSensorChanged(event.sensor.getType(),event.values);
    }

    public void onSensorChanged(int sensor, float[] values)
    {
    // if (sensor != SensorManager.SENSOR_ACCELEROMETER) return;
    long now = System.currentTimeMillis();

    if ((now - mLastForce) > SHAKE_TIMEOUT) {
    mShakeCount = 0;
    }

    if ((now - mLastTime) > TIME_THRESHOLD) {
    long diff = now - mLastTime;
    float speed = Math.abs(values[SensorManager.DATA_X] + values[SensorManager.DATA_Y] + values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ) / diff * 10000;
    if (speed > FORCE_THRESHOLD) {
    if ((++mShakeCount >= SHAKE_COUNT) && (now - mLastShake > SHAKE_DURATION)) {
    mLastShake = now;
    mShakeCount = 0;
    if (onSensor != null) {
    onSensor.onSensor();
    }
    Log.i(Float.toString(speed), Long.toString(diff)+"sc");
    }
    mLastForce = now;
    }
    mLastTime = now;
    mLastX = values[SensorManager.DATA_X];
    mLastY = values[SensorManager.DATA_Y];
    mLastZ = values[SensorManager.DATA_Z];
    }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

    }
    }



     

  • 相关阅读:
    【原创】自己动手写工具----签到器[Beta 1.0]
    都2020了,还不好好学学泛型?
    ThreadLocal = 本地线程?
    从BWM生产学习工厂模式
    你还在用BeanUtils进行对象属性拷贝?
    JDK 1.8 之 Map.merge()
    Spring Boot认证:整合Jwt
    以商品超卖为例讲解Redis分布式锁
    如何从 if-else 的参数校验中解放出来?
    分布式全局唯一ID生成策略​
  • 原文地址:https://www.cnblogs.com/meieiem/p/2226659.html
Copyright © 2011-2022 走看看