2013-08-25 3 views
0

나는이 비디오 here에 기반한 안드로이드의 나침반을 프로그램하려고했지만, 비디오보기가 이제는 더 이상 사용되지 않고 숫자로만 값을 가져와야한다는 사실이 있습니다 (예 : 135 ° NE 또는 234 °). SW. 그래서 어떤 사람들이 손을 내줄 수 있다면 정말 대단 할 것입니다. 조언 해 주셔서 감사합니다.나침반을 프로그래밍하는 방법은 무엇입니까?

답변

0

사용자 정의 나침반 View 클래스 : 주요 활동 클래스

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

빠른 답장을 보내 주셔서 감사합니다. Sensor.TYPE_ORIENTATION은 (는) 사용되지 않습니다 ... 새 Android 버전에서는 문제가되지 않거나 충돌이 발생합니까? – Elsanty

+0

문제가되지 않기를 바랍니다. 어쨌든, 그것이 어떻게되는지 당신 편에 확인하십시오. – fida1989

+0

예제를 사용하여 값을 표시하지만 부정적인 방법으로 값을 표시합니다 (예 : -24.4785 ...). 맞습니까? – Elsanty

0

당신은 할 수 있습니다 이미하지 않은 경우, 내가 가서 당신을 조언 것이라고하지만, 읽기 사용 가능한 센서 및 특정 사례에 대한 Android Documentation - 나침반 응용 프로그램을 설계하는 데 도움이 될 수 있습니다. 웹 페이지에서 "나침반"을 검색하면 더 모호한 관련 정보로 이동합니다. 행운을 빕니다!

+0

안녕하세요 @ go2 yeaaaa 사실 인터넷에서 일부 나침반 정보를 찾으려고 애쓰는 것은 정말로 어렵습니다. 검색 결과는 Android 앱을 소개하는 방법 또는 사용 방법이 아닌 사용 방법을 보여줍니다. – Elsanty