0

我正在尝试制作一个应用程序,它可以向我显示我的设备正在旋转的角度,并且还有一个菜单可以让我选择以度数或弧度查看结果,但是在运行此代码后,仅出现显示布局的屏幕并且在旋转设备时什么都没有发生请提前告诉我我错在哪里谢谢

package com.example.directordetector;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mInitialized = false;
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mAccelerometer = mSensorManager
            .getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
    mSensorManager.registerListener(this, mAccelerometer,
            SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_name, menu);
    return true;

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.degree:
        m = 0;
        return true;
    case R.id.radian:
        m = 1;
        return true;
    default:
        return super.onOptionsItemSelected(item);

    }

}

protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mAccelerometer,
            SensorManager.SENSOR_DELAY_NORMAL);
}

protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    TextView tvX = (TextView) findViewById(R.id.x_axis);
    TextView tvY = (TextView) findViewById(R.id.y_axis);
    TextView tvZ = (TextView) findViewById(R.id.z_axis);
    float x = event.values[0];
    float y = event.values[1];
    float z = event.values[2];
    if (!mInitialized) {
        mLastX = x;
        mLastY = y;
        mLastZ = z;
        tvX.setText("0.0");
        tvY.setText("0.0");
        tvZ.setText("0.0");
        mInitialized = true;
    } else {
        float deltaX = Math.abs(mLastX - x);
        float deltaY = Math.abs(mLastY - y);
        float deltaZ = Math.abs(mLastZ - z);
        if (deltaX < NOISE)
            deltaX = (float) 0.0;

        if (deltaY < NOISE)
            deltaY = (float) 0.0;

        if (deltaZ < NOISE)
            deltaZ = (float) 0.0;
        mLastX = x;
        mLastY = y;
        mLastZ = z;
        if (m == 1) {

            deltaX = (float) (deltaX * (3.18 / 180));
            deltaX = (float) (deltaX * (3.18 / 180));
            deltaX = (float) (deltaX * (3.18 / 180));
        }

        tvX.setText(Float.toString(deltaX));
        tvY.setText(Float.toString(deltaY));
        tvZ.setText(Float.toString(deltaZ));

    }

}
}
4

2 回答 2

0

我不知道为什么它不起作用。但我建议您不要将 findViewById() 调用放在传感器侦听器回调中。这种方法相当昂贵,而且您的传感器回调会收到很多调用。

在活动中声明您的视图,并在 onCreate() 中实例化它们,如下所示:

TextView tvX;
TextView tvY;
TextView tvZ;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tvX = (TextView) findViewById(R.id.x_axis);
    tvY = (TextView) findViewById(R.id.y_axis);
    tvZ = (TextView) findViewById(R.id.z_axis);
    ...
}

这样,您只需调用一次 findViewById(),您将始终能够使用您的引用来更改 TextView 中的文本。

当你运行你现在拥有的东西时,究竟会发生什么?TextViews 是否设置为“0.0”并保持这种状态?或者他们根本没有得到设置?

于 2012-06-14T13:09:29.640 回答
0

findViewById() 属于 onCreate() 方法(我还写了一个小库,它将为视图和其他一些东西执行依赖注入:https ://github.com/ko5tik/andject )

加速度计是错误的旋转传感器 - 您可以检测设备的移动或倾斜,但不能检测设备轴之一的旋转。为此使用磁场传感器

于 2012-06-14T13:17:32.107 回答