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

android 手机利用重力感应摇晃 换歌曲 “摇晃”实现

2011-09-05 19:37 696 查看
通过计算手机移动的速度,当速度达到某个只是判断为摇晃

实现方法:计算出手机移动 距离 时间 可求出速度。

package com.android.fuzhengchao;

import android.content.Context;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

/**

*

* 一个检测手机摇晃的监听器

* @author fuzhengchao

*

*/

public class ShakeListener implements SensorEventListener {

//速度阈值,当摇晃速度达到这值后产生作用

private static final int SPEED_SHRESHOLD = 4000;

//两次检测的时间间隔

private static final int UPTATE_INTERVAL_TIME = 70;

//传感器管理器

private SensorManager sensorManager;

//传感器

private Sensor sensor;

//重力感应监听器

private OnShakeListener onShakeListener;

//上下文

private Context context;

//手机上一个位置时重力感应坐标

private float lastX;

private float lastY;

private float lastZ;

//上次检测时间

private long lastUpdateTime;

//构造器

public ShakeListener(Context c) {

//获得监听对象

context = c;

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;

}

//重力感应器感应获得变化数据

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) {

}

}

运用方法:

ShakeListener shakeListener = new ShakeListener(this) //创建一个对象

shakeListener.setOnShakeListener(new OnShakeListener() { //调用setOnShakeListener方法进行监听

public void onShake() {

//对手机摇晃后的处理(如换歌曲,换图片……)

}

});

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