角度旋转探测器

时间:2012-06-14 13:04:32

标签: android

我正在尝试创建一个应用程序,它会向我显示我的设备正在旋转的角度,还有一个菜单可以让我选择以度数或弧度查看结果但是在运行此代码之后只显示屏幕显示布局和旋转设备没有任何事情发生的plzz告诉我提前我错误的Thanx

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));

    }

}
}

2 个答案:

答案 0 :(得分: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(),你就可以使用你的引用来改变TextViews中的文本。

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

答案 1 :(得分:0)

findViewById()属于onCreate()方法(我也写过小型库 会为视图和其他一些东西执行依赖注入:https://github.com/ko5tik/andject

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