0

オンボードの加速度計でボタンを押す力を調べようとしています。一連の読み取りを行い、値を比較する必要があると考えました。私の試みは次のようなものでした:

  velButton.setOnTouchListener(new OnTouchListener()
  {
        public boolean onTouch(View view, MotionEvent event)
        {
        int velocity = 0;

        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:

                velocity = getVelocity();
                velocityView.setText("This is the velocity: " +  velocity);
                break;

        }

        return false;
        });
    }

protected int getVelocity()
{
    float accent = 0;

    int velocity;


    try
    {
    accent = getHighestValue();
} catch (InterruptedException e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

velocity = (int) accent;

return velocity;
}


protected float getHighestValue()  throws InterruptedException
{
float highest;
float[] value = new float[20];
String txt = "";

for(int i = 0; i < value.length; i++)
{
    Thread.sleep(1);
    value[i] = accelerometer_z;
    txt += "Reading at: " + i + " ms returns: " + value[i] + "\n";
}

Arrays.sort(value);
highest = value[19];

textView2.setText(txt);

return highest;
}

float accelerometer_z はメイン アクティビティで初期化され、onSensorChanged を通じて継続的に更新されます。

ここでの問題は、一連の値を取得できないことです。getHighestValue メソッドの for ループから 1 つの値しか取得できません。

乾杯/M

onSensorChanged が追加されました:

@Override
  public void onSensorChanged(SensorEvent event) 
  {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
{
        getAccelerometer(event);
}

  }

  private void getAccelerometer(SensorEvent event) 
  {

float[] value = event.values;

// Movement
 accelerometer_x = value[0];
accelerometer_y = value[1];
accelerometer_z = value[2];


 accelationSquareRoot = (accelerometer_x * accelerometer_x + accelerometer_y * 
                            accelerometer_y + accelerometer_z * accelerometer_z)
    / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);


long actualTime = System.currentTimeMillis();
if (accelationSquareRoot >= 2) 
{
  if (actualTime - lastUpdate < 200) 
  {
    return;
  }
  lastUpdate = actualTime;


}

}

4

2 に答える 2

0

同時に実行できるイベント ハンドラーは 1 つだけのようです。これが、gethighestValue から 1 つの値しか取得できない理由です。onSensorChanged は、onTouch の motionEvent が新しい入力を待っている限り、新しい読み取りを行うことはできません。

onSensorChanged に次のようなメソッドを実装させることで、これを解決しました。

private void getAccelerometer(SensorEvent event)
    {
        float[] value = event.values;

        float accelerometer_x = value[0];
        float accelerometer_y = value[1];
        float accelerometer_z = value[2];

        accReadingZ.add(accelerometer_z);

        while(accReadingZ.size() > LIST_SIZE)
            accReadingZ.removeFirst();
    }

ここで、accReadingZ は、10 要素のサイズを持つクラス メンバーです。

Collections.max(accReadingZ) を使用して、一連の読み取り値の最高値を取得できるようになりました。

于 2012-11-13T14:42:29.890 に答える
0

あなたのforループでは、強制的Threadにスリープさせています

...
    Thread.sleep(1);
...

ここで、予想されるパラメーター (この場合は 1) はミリ秒単位です。

Threadセンサーからの実際の値が必要なため、意図は1ミリ秒強制的にスリープ状態にすることではなかったと思います。したがって、次のようになります。

...
    Thread.sleep(x * 1000);
...

ここで、xは感度に関して定義されます。

于 2012-11-09T09:58:19.580 に答える