您的位置:首页 > 移动开发 > Android开发

Android 实现摇晃手机的监听

2016-12-29 17:35 281 查看
原文地址:http://blog.csdn.net/xwren362922604/article/details/8515343

监听摇晃手机的类:

[html]
view plain
copy

/**  
 * @author renxinwei  
 *   
 * @date 2013-1-17 下午09:19:58  
 */  
public class SensorManagerHelper implements SensorEventListener {  
  
    // 速度阈值,当摇晃速度达到这值后产生作用  
    private static final int SPEED_SHRESHOLD = 5000;  
    // 两次检测的时间间隔  
    private static final int UPTATE_INTERVAL_TIME = 50;  
    // 传感器管理器  
    private SensorManager sensorManager;  
    // 传感器  
    private Sensor sensor;  
    // 重力感应监听器  
    private OnShakeListener onShakeListener;  
    // 上下文对象context  
    private Context context;  
    // 手机上一个位置时重力感应坐标  
    private float lastX;  
    private float lastY;  
    private float lastZ;  
    // 上次检测时间  
    private long lastUpdateTime;  
    // 构造器  
    public SensorManagerHelper(Context context) {  
        // 获得监听对象  
        this.context = context;  
        start();  
    }  
  
    // 开始  
    public void start() {  
        // 获得传感器管理器  
        sensorManager = (SensorManager) context  
                .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 interface OnShakeListener {  
        public void onShake();  
    }  
  
    // 设置重力感应监听器  
    public void setOnShakeListener(OnShakeListener listener) {  
        onShakeListener = listener;  
    }  
  
    /*  
     * (non-Javadoc)  
     * android.hardware.SensorEventListener#onAccuracyChanged(android.hardware  
     * .Sensor, int)  
     */  
    @Override  
    public void onAccuracyChanged(Sensor sensor, int accuracy) {  
        // TODO Auto-generated method stub  
    }  
  
    /*  
     * 重力感应器感应获得变化数据  
     * android.hardware.SensorEventListener#onSensorChanged(android.hardware  
     * .SensorEvent)  
     */  
    @Override  
    public void onSensorChanged(SensorEvent event) {  
        // TODO Auto-generated method stub  
        // 现在检测时间  
        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();  
    }  
}  

在Activity中使用:

[html]
view plain
copy

SensorManagerHelper sensorHelper = new SensorManagerHelper(this);  
        sensorHelper.setOnShakeListener(new OnShakeListener() {  
              
            @Override  
            public void onShake() {  
                // TODO Auto-generated method stub  
                System.out.println("shake");  
                Toast.makeText(MainActivity.this, "你在摇哦", Toast.LENGTH_SHORT).show();  
            }  
        });  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: