0

0 度から 90 度の間の角度のみを取得したいのですが、デバイスが 90 度のときに onSensorChnaged の角度が間違っています。その後 105 度になっています。正しい角度を取得するのを手伝ってください。これをデバイス samsung galaxy s duos でテストしました。また、UI がフリーズします。

private void init() {
        oldBitmap = BitmapFactory.decodeResource(getResources(),
                R.drawable.clock1);
        w = oldBitmap.getWidth();
        h = oldBitmap.getHeight();
        mtx = new Matrix();
        degrees = Integer.parseInt(x.toString());
        mtx.postRotate(-degrees);
        oldBitmap = Bitmap.createBitmap(oldBitmap, 0, 0, w, h, mtx, true);
        img.setScaleType(ScaleType.CENTER);
        img.setImageBitmap(oldBitmap);
    }
    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {                  
            //x = (int) Math.pow(event.values[0], 2);  // is for the right to left or left to right side angle
            //x = (int) Math.pow(event.values[2], 2); // this is for the bottom to top or top to bottom side angle
            x = (int) Math.pow(event.values[1], 2); // this is for both side angle

            try {
                Log.i("my x is..", "my degree is..."+x);    
                    txtanglex.setText(x.toString());            
                    init();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

上記のコードから、0 から 105 の間のデバイス角度を取得します

ここに画像の説明を入力

4

1 に答える 1

0

Sensor を使用して角度を取得するサンプル コードを次に示します。

private float[] mGravity;
private float[] mMagnetic;
private float angle_value;

private float getDirection()
{

    float[] temp = new float[9];
    float[] R = new float[9];
    //Load rotation matrix into R
    SensorManager.getRotationMatrix(temp, null,
            mGravity, mMagnetic);

    //Remap to camera's point-of-view
    SensorManager.remapCoordinateSystem(temp,
            SensorManager.AXIS_X,
            SensorManager.AXIS_Z, R);

    //Return the orientation values
    float[] values = new float[3];
    SensorManager.getOrientation(R, values);

    //Convert to degrees
    for (int i=0; i < values.length; i++) {
        Double degrees = (values[i] * 180) / Math.PI;
        values[i] = degrees.floatValue();
    }

    return values[0];

}

@Override
public void onSensorChanged(SensorEvent event) {
    switch(event.sensor.getType()) {

    case Sensor.TYPE_ACCELEROMETER:
        mGravity = event.values.clone();
        break;
    case Sensor.TYPE_MAGNETIC_FIELD:
        mMagnetic = event.values.clone();
        break;
    default:
        return;
    }
    if(mGravity != null && mMagnetic != null) {
        angle_value = getDirection();
    }
}

angle_value必要な0-180場合のみ、この0-90ようなロジックを使用する必要があります。

if(angle_value>90)
{
   angle_value=angle_value-90;
}
于 2012-11-05T06:30:25.510 に答える