Android小球运动——手机传感

写手机传感器需要知道一些关于传感器的东西,这些来自百度,了解手机传感器的种类和功能:
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;
        }

猜你喜欢

转载自blog.csdn.net/weixin_42621338/article/details/82494249