2013-08-25 5 views
0

Я пытался запрограммировать компас в андроиде, основанный на этом видео here, но дело в том, что некоторые вещи, которые показывают видеоролики, теперь устарели, а также мне просто нужно получить значения в цифрах, например 135 ° NE или 234 ° SW. Так что если кто-то может дать руку, это будет действительно замечательно. Спасибо за консультацию.Как запрограммировать компас?

ответ

0

Пользовательские компас Просмотр класс:

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.View; 

public class MyCompassView extends View { 

    private Paint paint; 
    private float position = 0; 

    public MyCompassView(Context context) { 
    super(context); 
    init(); 
    } 

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

    @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 updateData(float position) { 
    this.position = position; 
    invalidate(); 
    } 

} 

Основной класс деятельности:

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private static SensorManager sensorService; 
    private MyCompassView compassView; 
    private Sensor sensor; 


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

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

    sensorService = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    sensor = sensorService.getDefaultSensor(Sensor.TYPE_ORIENTATION); 
    if (sensor != null) { 
     sensorService.registerListener(mySensorEventListener, sensor, 
      SensorManager.SENSOR_DELAY_NORMAL); 
     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() { 

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

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // angle between the magnetic north directio 
     // 0=North, 90=East, 180=South, 270=West 
     float azimuth = event.values[0]; 
     compassView.updateData(azimuth); 
    } 
    }; 

    @Override 
    protected void onDestroy() { 
    super.onDestroy(); 
    if (sensor != null) { 
     sensorService.unregisterListener(mySensorEventListener); 
    } 
    } 

} 
+0

Привет @ fida1989 благодарит за быстрый ответ, но Sensor.TYPE_ORIENTATION устарел ... это не имеет значения или сбой с новыми версиями Android? – Elsanty

+0

Надеюсь, это не проблема. В любом случае, проверьте на своей стороне, как это происходит. – fida1989

+0

Я использую ваш пример и показывает мне значения, но он также показывает значения отрицательным образом, например -24.4785 ... это правильно? – Elsanty

0

Вы, возможно, уже читали, но если нет, то я бы посоветовал вам идти над Android Documentation о доступных датчиках и в вашем конкретном случае - что могло бы помочь вам сконструировать ваше приложение компаса. Поиск «компаса» на веб-странице приведет вас к более неясной релевантной информации. Удачи!

+0

hi @ go2 yeaaaa Это правда, пытаясь найти какую-то информацию о компасе в Интернете, очень сложно, результат поиска просто показывает приложениям intall android compaas или как их использовать, а не как их выполнять – Elsanty