1

私のアプリには、「compassView」クラスでレンダリングされる基本的なコンパスがあります。Display Compass アクティビティで contentView を次のように設定すると、問題なく動作し、compassView = new CompassView(this); setContentView(compassView);北を指しますが、コンテンツ ビューを設定する setContentView(activity_display_compass)と、コンパスとテキストビューがレンダリングされますが、コンパスは静的です。すなわち、針は動かない。私はこれを引き起こしているものに途方に暮れています。ガイダンスをいただければ幸いです。

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"/>

    <com.example.gpsfinder.CompassView
        android:id="@+id/compassView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

コンパス アクティビティの表示

public class DisplayCompass extends Activity {

      private static SensorManager sensorService;
      private CompassView compassView;
      private Sensor  sensorAccelerometer;
      private Sensor  sensorMagnetometer;

      private float [] lastAccelerometer = new float[3];
      private float [] lastMagnetometer = new float[3];
      private boolean  lastAccelerometerSet = false;
      private boolean lastMagnetometerSet = false;

      private float[] rotation = new float[9];
      private float[] orientation = new float[3];


    /** Called when the activity is first created. */

      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        compassView = new CompassView(this);
        setContentView(compassView);

        sensorService = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensorAccelerometer = sensorService.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorMagnetometer = sensorService.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        //sensor = sensorService.getDefaultSensor(Sensor.TYPE_ORIENTATION);

        if (sensorAccelerometer != null &&  sensorMagnetometer != null) {
          sensorService.registerListener(mySensorEventListener, sensorAccelerometer,
              SensorManager.SENSOR_DELAY_UI);
          sensorService.registerListener(mySensorEventListener, sensorMagnetometer,
                  SensorManager.SENSOR_DELAY_UI);
          Log.i("Compass MainActivity", "Registerered for ORIENTATION Sensor");

        } else {
          Log.e("Compass MainActivity", "Registerered for ORIENTATION Sensor");
          Toast.makeText(this, "ORIENTATION Sensor not found",
              Toast.LENGTH_LONG).show();
          finish();
        }
      }

      private SensorEventListener mySensorEventListener = new SensorEventListener() {


        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }


        public void onSensorChanged(SensorEvent event) {
            if(event.sensor == sensorAccelerometer){
                System.arraycopy(event.values,0,lastAccelerometer, 0,event.values.length);
                lastAccelerometerSet= true;
            }
            else if (event.sensor == sensorMagnetometer){
                System.arraycopy(event.values,0,lastMagnetometer, 0,event.values.length);
                lastMagnetometerSet = true;
            }
            if(lastAccelerometerSet && lastMagnetometerSet)
                SensorManager.getRotationMatrix(rotation,null,lastAccelerometer ,lastMagnetometer );
                SensorManager.getOrientation(rotation,orientation);
          // angle between the magnetic north direction
          // 0=North, 90=East, 180=South, 270=West
          double azimuth = Math.toDegrees(orientation[0]);
          compassView.updateDirection(azimuth);
        }
      };

      @Override
      protected void onDestroy() {
        super.onDestroy();
          sensorService.unregisterListener(mySensorEventListener);

      }
}

コンパス ビュー

public class CompassView extends View{

     private Paint paint;
      private double position = 0;

      public CompassView(Context context) {
        super(context, null);
        init();
      }

      public CompassView(Context context, AttributeSet attrs) {
            super(context,attrs, 0);
            init();
      }

      public CompassView(Context context, AttributeSet attrs,int defStyle) {
            super(context,attrs, defStyle);
            init();
      }



      private void init() {
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5);
        paint.setTextSize(25);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.RED);
      }

      @Override
      protected void onDraw(Canvas canvas) {
        int xPoint = getMeasuredWidth() / 2;
        int yPoint = getMeasuredHeight() / 2;

        float radius = (float) (Math.max(xPoint, yPoint) * 0.6);
        canvas.drawCircle(xPoint, yPoint, radius, paint);
        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);

        // 3.143 is a good approximation for the circle
        canvas.drawLine(xPoint,
            yPoint,
            (float) (xPoint + radius
                * Math.sin((double) (-position) / 180 * 3.143)),
            (float) (yPoint - radius
                * Math.cos((double) (-position) / 180 * 3.143)), paint);

        canvas.drawText(String.valueOf(position), xPoint, yPoint, paint);
      }

      public void updateDirection(double azimuth) {
        this.position = azimuth;
        invalidate();
      }

    } 
4

1 に答える 1

2

あなたの問題は、最初にアプリをコーディングしたときに、プログラムCompassViewでこれを作成していたことです。

    compassView = new CompassView(this);
    setContentView(compassView);

XML レイアウトを使用するように変更したとき、その最初の行はおそらく削除されました。ただし、のメソッドcompassViewで使用するため、メンバー変数を割り当てる必要があります。あなたは取得していました( LogCatを見るとわかります)。SensorEventListeneronSensorChanged()NullPointerException

したがって、あなたのonCreate()メソッドでは、コンテンツビューを設定した後、これを行うことを忘れないでください:

setContentView(R.layout.activity_display_compass);
compassView = (CompassView)findViewById(R.id.compassView);  // <- missing?!
于 2013-06-04T22:47:39.783 に答える