安卓手机监听手机是否摇动的功能,也就是类似于微信摇一摇功能.一看好像感觉挺厉害挺难得一个功能一样,实则不然,我们知道每个安卓手机都有传感器在里面,可以监听到手机的状态.我们说的摇一摇监听,该功能就需要用到传感器.
用到比较核心的几个类:
SensorEventListener:传感器的监听器.
SensorManager:传感器的管理器.
Sensor:传感器.
我们都知道一般获取某个管理器都是contexnt.getSystemService()调用系统的服务的方法.所以我们获取传感器的管理器的方法就是
mSensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
然后通过传感器管理者获取传感器对象.
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
然后把传感器管理者和传感器绑定在一起,也就是注册的意思.
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
该方法第一个参数就为SensorEventListener,第二个参数是传感器Sensor,第三个参数就是一个常量.
然后实现监听器中的抽象方法:
@Override
public void onSensorChanged(SensorEvent Event) {
//防止频繁调用
if ((System.currentTimeMillis() - LastTime) < mInterval) {
return;
}
LastTime = System.currentTimeMillis();
//获取x,y,z 代表的分别是水平面的位置,和垂直面的位置,和空间位置.
float NowX = Event.values[0];
float NowY = Event.values[1];
float NowZ = Event.values[2];
//计算x,y,z变化量
float DeltaX = NowX - LastX;
float DeltaY = NowY - LastY;
float DeltaZ = NowZ - LastZ;
//赋值(把最后一次的值记录下来)
LastX = NowX;
LastY = NowY;
LastZ = NowZ;
//计算
double NowSpeed = Math.sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ * DeltaZ) / mInterval * 10000;
if (NowSpeed >= mSpeed) {
//判断当前做了摇一摇的操作,做对应的逻辑处理
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
在判断中作出对应的逻辑就行了.
贴上全部代码:
public class MainActivity extends AppCompatActivity implements SensorEventListener {
//传感器管理者
private SensorManager mSensorManager;
//传感器
private Sensor mSensor;
//通过该值可以控制灵敏度越小越灵敏
private int mSpeed = 3000;
//时间间隔
private int mInterval = 50;
//最后一次摇晃的时间
private long LastTime;
//最后一次的x、y、z坐标
private float LastX, LastY, LastZ;
MyDialog myDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
myDialog = new MyDialog(this);
}
@Override
public void onSensorChanged(SensorEvent Event) {
//防止频繁调用
if ((System.currentTimeMillis() - LastTime) < mInterval) {
return;
}
LastTime = System.currentTimeMillis();
//获取x,y,z 代表的分别是水平面的位置,和垂直面的位置,和空间位置.
float NowX = Event.values[0];
float NowY = Event.values[1];
float NowZ = Event.values[2];
//计算x,y,z变化量
float DeltaX = NowX - LastX;
float DeltaY = NowY - LastY;
float DeltaZ = NowZ - LastZ;
//赋值(把最后一次的值记录下来)
LastX = NowX;
LastY = NowY;
LastZ = NowZ;
//计算
double NowSpeed = Math.sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ * DeltaZ) / mInterval * 10000;
if (NowSpeed >= mSpeed) {
//判断当前做了摇一摇的操作,做对应的逻辑处理
if (myDialog != null && !myDialog.isShowing()) {
myDialog.show();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
以上就是全部代码.我在摇动手机后弹出一个dialog.