Я пытался запрограммировать компас в андроиде, основанный на этом видео here, но дело в том, что некоторые вещи, которые показывают видеоролики, теперь устарели, а также мне просто нужно получить значения в цифрах, например 135 ° NE или 234 ° SW. Так что если кто-то может дать руку, это будет действительно замечательно. Спасибо за консультацию.Как запрограммировать компас?
ответ
Пользовательские компас Просмотр класс:
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);
}
}
}
Вы, возможно, уже читали, но если нет, то я бы посоветовал вам идти над Android Documentation о доступных датчиках и в вашем конкретном случае - что могло бы помочь вам сконструировать ваше приложение компаса. Поиск «компаса» на веб-странице приведет вас к более неясной релевантной информации. Удачи!
hi @ go2 yeaaaa Это правда, пытаясь найти какую-то информацию о компасе в Интернете, очень сложно, результат поиска просто показывает приложениям intall android compaas или как их использовать, а не как их выполнять – Elsanty
Привет @ fida1989 благодарит за быстрый ответ, но Sensor.TYPE_ORIENTATION устарел ... это не имеет значения или сбой с новыми версиями Android? – Elsanty
Надеюсь, это не проблема. В любом случае, проверьте на своей стороне, как это происходит. – fida1989
Я использую ваш пример и показывает мне значения, но он также показывает значения отрицательным образом, например -24.4785 ... это правильно? – Elsanty