android 摇一摇功能的实现

将这个功能封装成了一个类,这样今后方便调用

package com.bobo.myyaoyiyaotest;

import android.R.bool;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class ShakeListener implements SensorEventListener {
    String TAG = "ShakeListener";
    // 速度阈值,当摇晃速度达到这值后产生作用
    // 两次检测的时间间隔
    private static final int UPTATE_INTERVAL_TIME = 300;
    // 传感器管理器
    private SensorManager sensorManager;
    // 传感器
    private Sensor sensor;
    // 重力感应监听器
    private OnShakeListener onShakeListener;
    // 上下文
    private Context mContext;
    // 手机上一个位置时重力感应坐标
    private float[] lastValues = { 0, 0, 0 };
    private float[] curValues = { 0, 0, 0 };

    // 上次检测时间
    private long lastUpdateTime;
    private long curUpdateTime;

    // 构造器
    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) {
            sensorManager.registerListener(this, sensor,
                    SensorManager.SENSOR_DELAY_GAME);
        }
    }

    // 停止检测
    public void stop() {
        sensorManager.unregisterListener(this);
    }

    // 设置重力感应监听器
    public void setOnShakeListener(OnShakeListener listener) {
        onShakeListener = listener;
    }

    private boolean isShake = false;

    // 重力感应器感应获得变化数据
    public void onSensorChanged(SensorEvent event) {
        // 现在检测时间
        curUpdateTime = System.currentTimeMillis();
        curValues = event.values;
        // 两次检测的时间间隔
        long timeInterval = curUpdateTime - lastUpdateTime;
        // 判断是否达到了检测时间间隔
        if (timeInterval < UPTATE_INTERVAL_TIME)
            return;
        isShake = false;
        lastUpdateTime = curUpdateTime;
        // 现在的时间变成last时间
        if (!isShake && (curValues[0] - lastValues[1] > 20)) {
            isShake = true;
            onShakeListener.onShake();
        }
        lastValues = curValues;
    }

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

    // 摇晃监听接口
    public interface OnShakeListener {
        public void onShake();
    }
}

注意这里面定义了一个OnShakeListener的接口,可以在调用的方法中,实现该接口,利用setOShakeListener方法赋予其即可。

package com.bobo.myyaoyiyaotest;

import com.bobo.myyaoyiyaotest.ShakeListener.OnShakeListener;

import android.os.Bundle;
import android.os.Vibrator;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {
    private Vibrator mVibrator = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Vibrator vibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);
        ShakeListener listener=new ShakeListener(this);
        listener.setOnShakeListener(new OnShakeListener() {
            
            @Override
            public void onShake() {
                    //这里仅仅需要执行摇一摇之后的操作即可。
                mVibrator.vibrate(new long[]{10,1000}, -1);
            }
        });
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

这种耦合,以及回调的思想可谓极好
原文地址:https://www.cnblogs.com/bobodeboke/p/3419561.html