0

私は、加速度計と方向計を取得し、値に基づいていくつかのグラフィックを表示する簡単なコードを作成しました。

package pl.aadamczyk.enginesdriver;

import android.app.Activity;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;

public class EnginesDriverActivity extends Activity implements SensorEventListener
{
    private SensorManager sensorManager;
    private Sensor accelerometer;
    private Sensor orientation;
    private Panel panel;

    public EnginesDriverActivity()
    {
        sensorManager = null;
        accelerometer = null;
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        orientation = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

        panel = new Panel(this.getApplicationContext(), null);

        setContentView(panel);
    }

     protected void onResume()
     {
         super.onResume();
         sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
         sensorManager.registerListener(this, orientation, SensorManager.SENSOR_DELAY_NORMAL);
     }

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

    @Override
    public void onSensorChanged(SensorEvent se)
    {
        Sensor source = se.sensor;

        if (source == accelerometer)
        {
            System.out.println("Updating orientation: " + se.values[1]);
            panel.setOrientation(se.values);
        }
        else if (source == orientation)
        {
            System.out.println("Updating TYPE_ACCELEROMETER: " + se.values[1]);
            panel.setAccelerometer(se.values);
        }

        panel.postInvalidate();
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int arg1)
    {

    }
}


package pl.aadamczyk.enginesdriver;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class Panel extends View
{
    private Paint paint;
    private float[] orientation;
    private float[] accelerometer;

    public Panel(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        orientation = new float[]{0, 0, 0};
        accelerometer = new float[]{0, 0, 0};
    }

    public void setOrientation(float[] _orientation)
    {
        orientation = _orientation;
    }

    public void setAccelerometer(float[] _accelerometer)
    {
        accelerometer = _accelerometer;
    }   

    @Override
    protected void onDraw(Canvas canvas)
    {
        // Some calculations here
        float y = orientation[1];
        float z = orientation[2];

        System.out.println(y);

        // Some graphics here
    }
}

問題は、方向の値と加速度計の値が混ざり合って、奇妙なものが表示されることです。コードには2つのSystem.out.println()があります。1つはonSensorChangedで適切な値を表示し、2つ目はonDrawの表示方向または加速度計の値です。

どうしてそれは可能ですか?

アドバイスに感謝し、私の英語をお詫びします。

4

1 に答える 1

1

私の推測では、SensorEventオブジェクトはシステムによって再利用されます。したがって、PanelView内のOnSensorChangedまたはsetterメソッドの値をコピーするだけです。

        System.arraycopy(ev.values, 0,copy, 0, 3);
于 2012-04-07T09:55:08.977 に答える