实现效果图
===================
此Demo可以实时设置调整灵敏度,方便测试。
摇一摇原理简介
手机摇一摇的实现,无非就是利用手机上的加速传感器,得到x、y、z轴三个方向的加速度。通过判断加速度的状态,来判断用户是否摇动了手机。而因为重力加速度一直存在,所以在一个方向上的加速度一直是9点多,设计的时候我们要考虑到这一点。
实现过程
第一步:先获得加速度传感器
sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
if(sensorManager==null) return;
sensor=(sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
上面做了简单判断,防止出空指针
我这里用到了手机震动,所以还需要获得手机震动服务
vibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);
手机振动需要添加限权:
<uses-permission android:name="android.permission.VIBRATE"/>
第二步: 为传感器设置好监听(布局文件和setViews代码比较简单,暂时不在这里写了,会出现在下面的源码中)
listener=new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
try{
long currentTime=System.currentTimeMillis();
long timeInterval=Long.valueOf(etTimeInterval.getText().toString());
if(timeInterval>currentTime-lastTime) return;//如果两次回调间隔过小,直接忽略
float[] values=event.values;
float x=values[0];
float y=values[1];
float z=values[2];
if(Math.abs(z)>11||Math.abs(x)>5||Math.abs(y)>3) {
Log.i("TAG","x:"+x);
Log.i("TAG","y:"+y);
Log.i("TAG","z:"+z);
}
float deltaX=x-lastX;
float deltaY=y-lastY;
float deltaZ=z-lastZ;
lastX=x;
lastY=y;
lastZ=z;
double speed=(Math.sqrt(deltaX*deltaX+deltaY*deltaY+deltaZ*deltaZ)/timeInterval)*100;
if(speed>Double.valueOf(etSpeed.getText().toString())){
vibrator.vibrate(300);