0

複数のクラスを使用して加速度計の測定値を表示したいと考えています。単一のクラスで加速度計の読み取り値を取得しようとしましたが、完全に正常に動作します。しかし、このコードでは、出力は 0.00000 、 0.000000 、 0.00000 です

ここに私の2つのクラスがあります:

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);  
}
}
4

1 に答える 1

2

AccData利用可能な値が更新されたことを他のクラスに通知するメカニズムが必要です。通常、これはリスナーによって行われます。この概念は、次のコード行で既に利用されています。

public class AccData extends Activity implements SensorEventListener

AccData新しい SensorEvent が発生すると、クラスに通知されます。リスナーの作成方法の詳細については、この Java チュートリアル ページを参照してください。

基本的なアイデアを提供するには:

  • リスナー用のインターフェースを作成します。

    public interface MyListener{
      public void processSensorEvent(SensorEvent event);
    }
    
  • class に registerListener/ unregisterListener メソッドを追加しますAccData。登録されたリスナーを格納するためのデータ構造も追加します。
  • 内部から呼び出され、新しい SensorEvent を引数として受け取るメソッドを記述しますfireUpdateAccDataonSensorChanged

    @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)それを使用してテキストビューを更新できます。

    public void processSensorEvent(SensorEvent event){
      TextView display=(TextView)findViewById(R.id.tv);
      display.setText(event.values[0] + " " + event.values[1] + " " + event.values[2]);
    }
    
于 2013-10-26T20:21:55.313 に答える