我想使用多个类来显示加速度计读数。我试图在单个课程中获得加速度计的读数,并且运行得很好。
但是在此代码中,输出为0.00000,0.000000,0.00000

这是我的两节课:

package com.example.sample;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
import android.content.Context;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    AccData accl=new AccData();

    accl.mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    accl.sensor = accl.mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    accl.register();
    String result=accl.getAccelerometerReading();
    TextView display=(TextView)findViewById(R.id.tv);
    display.setText(result);

}
}


2。

package com.example.sample;


import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.app.Activity;
import android.content.Context;

public class AccData extends Activity implements SensorEventListener {


public float acclX,acclY,acclZ;
public SensorManager mSensorManager;
public Sensor sensor;


@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    acclX = event.values[0];
    acclY =event.values[1];
    acclZ = event.values[2];
    }

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

}


public void register() {
    // TODO Auto-generated method stub
    mSensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL);
}
protected void unregister() {
    mSensorManager.unregisterListener(this, sensor);
}
protected String getAccelerometerReading()
{
    return String.format("%7f" + ", %7f"+ ", %7f" ,acclX,acclY,acclZ);
}
}

最佳答案

您需要一种机制来通知其他类AccData具有可用的更新值。通常,这是由侦听器完成的-您已经在以下代码行中使用了此概念:

public class AccData extends Activity implements SensorEventListener


当有新的SensorEvent时,类AccData会得到通知。
有关如何编写侦听器的更多信息,请参见this Java tutorials page

给你一个基本的想法:


为侦听器创建一个接口,例如

public interface MyListener{
  public void processSensorEvent(SensorEvent event);
}

将registerListener / unregisterListener方法添加到类AccData。还添加一个数据结构来存储注册的侦听器。
fireUpdate中编写在AccData中调用的方法onSensorChanged,该方法将新的SensorEvent作为参数。

@Override
public void onSensorChanged(SensorEvent event) {
  acclX = event.values[0];
  acclY =event.values[1];
  acclZ = event.values[2];
  fireUpdate(event);


}
fireUpdate的目的是遍历已注册的侦听器列表,并调用其对方法processSensorEvent(SensorEvent event)的实现。

private void fireUpdate(SensorEvent event){
  for (MyListener listener: MyListeners){
    listener.processSensorEvent(event);
  }
}

让您的主要活动实现MyListener

public class MainActivity extends Activity implements MyListener{

然后,您将必须在主要活动中实现方法processSensorEvent(SensorEvent event),并可以使用它来更新textview。

public void processSensorEvent(SensorEvent event){
  TextView display=(TextView)findViewById(R.id.tv);
  display.setText(event.values[0] + " " + event.values[1] + " " + event.values[2]);
}

10-02 10:17