写手机传感器需要知道一些关于传感器的东西,这些来自百度,了解手机传感器的种类和功能:
“https://baike.baidu.com/item/%E6%89%8B%E6%9C%BA%E4%BC%A0%E6%84%9F%E5%99%A8”
让小球运动起来需要使用的是加速度传感器:Sensor.TYPE_ACCELEROMETER
那么,我们究竟该如何设置传感器呢?
第一步: 获取传感器对象:
**注意:传感器在主线程获取,注册,取消注册**
// 手机所有传感器都要通过SensorMannager访问,调用getSystemService(SENSOR_SERVICE)方法就可以拿到当前手机的传感器管理对象
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
第二步: 获取需要使用的传感器类型:
/**
* registerListener这个方法有三个参数。 第一个参数是传感器数据变化的监听器 第二个参数是我们需要监听的传感器
* 第三个参数是传感器数据更新数据的速度
*/
@Override
public void onResume() {
super.onResume();
// 为系统的加速度传感器注册监听器
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
}
同时也可以在onstop中取消注册
@Override
public void onStop() {
super.onStop();
// 取消注册
sensorManager.unregisterListener(this);
}
第三步: 获取传感器回调值
// 以下是实现SensorEventListener接口必须实现的方法
// 当传感器的值发生改变时回调该方法
@Override
public void onSensorChanged(SensorEvent arg0) {
// 因为myball会在BallAI中声明对象,所以可将values通过BallAI将values传到线程中,在传给myball
values = arg0.values;
// StringBuffer可变长字符串,append向尾部追加
StringBuilder sb = new StringBuilder();
sb.append("x方向上的加速度");
sb.append(values[0]);
sb.append("y方向上的加速度");
sb.append(values[1]);
sb.append("z方向上的加速度");
sb.append(values[2]);
textView1.setText(sb.toString());
}
// 当传感器精度改变时回调该方法
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
第二、三步可合并为内部类形式,如下
@Override
protected void onResume() {
super.onResume();
// 为加速度传感器注册监听器
mSensorManager.registerListener(new SensorEventListener() {
// 当传感器的值改变的时候回调该方法
@Override
public void onSensorChanged(SensorEvent event) {
}
// 当传感器精度发生改变时回调该方法
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}, mSensor, SensorManager.SENSOR_DELAY_GAME);
}
重点需要注意的是其中加速度传感器值的传递:
通过ballAI实例化对象的构造方法,传递到ballAI类中,又由该类中myball实例化对象的构造方法传入myball类中得到xy方向加速度
到此,上一篇博客中的myball小球的move方法就有了需要的数据
myball类中
public void MoveMyball(){
//移动myball
speedx = -1*values[0]*3;
speedy = values[1]*3;
//将速度抵消,小球在边界不会来回弹跳
if(values[0]>0)
x += speedx;
if(values[1]>0)
y += speedy;
if(values[0]<=0)
x += speedx;
if(values[1]<=0)
y += speedy;
if(x < r || x+r > imageView1.getWidth()){
speedx *= -1;
x+= speedx;
}
if(y < r || y+r > imageView1.getHeight()){
speedy *= -1;
y += speedy;
}