Android 摇一摇功能实现,重力加速度大于15

最近接到需求实现摇一摇需求,不过这个法律限制的很严格,属于敏感地带,实现后又被叫停了。

法律要求:
摇一摇

如果按照规定,操作时间不少于3s就基本没什么跳转了。
实现的话,只考虑了第一条,即:x,y,z只要有一个方向重力加速度大于15就可以跳转。

工具类:

public class ShakeUtils implements SensorEventListener {

    private ArrayList<OnShakeListener> mOnShakeListeners = null;
    // 触发Shake的最小时间间隔
//    private static final int MIN_SHAKE_INTERVAL = 1024;
    private static final int MIN_SHAKE_INTERVAL = 500;
    // 上次触发Shake操作的时间
    private long mLastShakeTime = 0L;

    private long mLastUpdateTime = 0L;
    // 两次摇晃的最小时间间隔
    private static final int SHAKE_INTERVAL_MILLSECOND = 55;
    // 上次摇晃的重力坐标位置
    private float mLastX = 0;
    private float mLastY = 0;
    private float mLastZ = 0;

    public interface OnShakeListener {
        void onShake();
    }

    private SensorManager mSensorManager;

    public ShakeUtils() {
        Context context = App.getInstance();
        mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);

        mOnShakeListeners = new ArrayList<>();
    }

    public void bindShakeListener(OnShakeListener listener) {
        if (listener != null) {
            mOnShakeListeners.add(listener);
        }
    }

    // 销毁
    public void unBindShakeListener(OnShakeListener listener) {
        if (mOnShakeListeners != null) {
            mOnShakeListeners.remove(listener);
        }
        if (mSensorManager != null) {
            mSensorManager.unregisterListener(this);
        }
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event == null) {
            return;
        }

        long curUpdateTime = System.currentTimeMillis();
        // 两次位置改变的时间间隔
        long timeInterval = curUpdateTime - mLastUpdateTime;

        if (timeInterval < SHAKE_INTERVAL_MILLSECOND) {
            return;
        }

        if (event.values.length < 3) {
            return;
        }

        mLastUpdateTime = curUpdateTime;

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        float deltaX = x - mLastX;
        float deltaY = y - mLastY;
        float deltaZ = z - mLastZ;

        mLastX = x;
        mLastY = y;
        mLastZ = z;

        // 法律要求不低于15
        // 如果不敏感请自行调低该数值,低于10的话就不行了,因为z轴上的加速度本身就已经达到10了
        int medumValue = 16;
        // 只要有一个重力加速度大于16就可以
        if (Math.abs(x) > medumValue || Math.abs(y) > medumValue || Math.abs(z) > medumValue) {
//            DebugUtil.error("---onShake speed- x轴方向的重力加速度" + Math.abs(x) + ";y轴方向的重力加速度" + Math.abs(y) + ";z轴方向的重力加速度" + Math.abs(z));
            startShake();
        }

        // 如果使用这个方式,建议值是450,或者500
//        double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) * 1000.0 / timeInterval;
//        if (speed >= SPEED_SHAKE_MILLSECONDS) {
//            startShake(speed);
//        }
    }

    private void startShake() {
        long curShakeTime = System.currentTimeMillis();
        if (curShakeTime - mLastShakeTime < MIN_SHAKE_INTERVAL) {
            return;
        }
        mLastShakeTime = curShakeTime;
        if (mOnShakeListeners != null) {
            for (int i = 0; i < mOnShakeListeners.size(); i++) {
                mOnShakeListeners.get(i).onShake();
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}

直接放在Activity上即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Android手机上摇一摇功能的算法步骤如下: 1. 获取加速度传感器数据:通过注册传感器事件监听器,获取手机加速度传感器的数据。 2. 计算加速度变化量:对获取到的数据进行处理,得到三轴方向上的加速度变化量。 3. 判断是否摇动:根据加速度变化量的大小和变化频率,判断用户是否在摇动手机。可以设置一个阈值,当加速度变化量超过该阈值时,认为用户正在进行摇动操作。 4. 触发事件:当用户摇动手机时,可以触发相应的事件,例如播放音效、震动等。 下面是一段简单的代码示例,实现Android手机上摇一摇功能: ```java public class ShakeActivity extends AppCompatActivity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mAccelerometer; private static final int SHAKE_THRESHOLD = 800; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shake); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } @Override protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; float acceleration = (float) Math.sqrt(x * x + y * y + z * z); if (acceleration > SHAKE_THRESHOLD) { // 触发事件,例如播放音效、震动等 } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // do nothing } } ``` 在该代码中,我们通过注册传感器事件监听器,获取手机加速度传感器的数据,并根据加速度变化量的大小和变化频率,判断用户是否在摇动手机。当用户摇动手机时,可以触发相应的事件,例如播放音效、震动等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值