使用android加速度计检测力峰值

时间:2012-11-09 09:35:30

标签: android sensor

我正试图找出用板载加速度计按下按钮的力。 我想我必须做一系列的读数然后比较这些值。 我的尝试是这样的:

  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循环获得一个值。

干杯 / 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;


}

}

2 个答案:

答案 0 :(得分:0)

在你的for循环中,你强迫Thread

一起睡觉
...
    Thread.sleep(1);
...

其中预期参数(在您的情况下为1)以毫秒为单位。

我想,你的意图是不要强迫Thread睡1毫秒,因为你想要传感器的实际值。所以这应该是这样的:

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

其中x是针对敏感度定义的。

答案 1 :(得分:0)

似乎只能同时运行一个事件处理程序,这就是为什么我只从gethighestValue获取单个值的原因。 只要onTouch中的motionEvent等待新输入,onSensorChanged将永远不会被允许进行新的读取。

我通过让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)获取系列读数中的最高值。