2013-08-25 164 views
0

我一直在試圖編程一個指南針在這個視頻here安卓android的,但事情是,有些事情,視頻顯示現在已棄用,也只需要獲取數值,例如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這是真的,試圖找到一些在互聯網上的指南針信息真的很難,搜索結果只顯示安裝Android Compaas應用程序或如何使用它們,而不是如何做到這一點 – Elsanty