2013-05-20 80 views
3

嗨在我的應用程序中,我需要創建一個陀螺儀。因此,我使用以下代碼。如何將Yaw,Roll&Pitch值轉換爲(x,y)座標?

public class AccessGyroscope extends Activity implements SensorEventListener 
{ 
    private TextView tv; 
    private SensorManager sManager; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     tv = (TextView) findViewById(R.id.tv); 
     sManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST); 
    } 

    @Override 
    protected void onStop() 
    { 
     sManager.unregisterListener(this); 
     super.onStop(); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) 
    { 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) 
    { 
     if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) 
     { 
      return; 
     } 

     tv.setText("Orientation X (Roll) :"+ Float.toString(event.values[2]) +"\n"+ 
        "Orientation Y (Pitch) :"+ Float.toString(event.values[1]) +"\n"+ 
        "Orientation Z (Yaw) :"+ Float.toString(event.values[0])); 
    } 
} 

我能得到的偏航,滾動&間距值,但我想在2D平面顯示這一點。 基本上我想要這樣的看法Gyroscope View

紅點應該根據設備的方向移動。我可以在畫布上工作以準備該視圖。但我真正想要的是與Yaw相關的座標,滾動&俯仰值。

請幫忙

回答

3

最後我找到了答案。

首先不使用TYPE_ORIENTATION我使用TYPE_GRAVITY。

這是我的完整代碼。

代碼爲我的自定義視圖是..

public class GyroscopeView extends View 
{ 
    private final static String TAG = "GyroscopeView"; 

    private float bearing; 
    float pitch = 0; 
    float roll = 0; 

    private Paint paintOuter; 
    private Paint paintInner; 
    private Paint paintDot; 

    float pointX, pointY; 
    float dotX, dotY; 
    int radius; 

    public GyroscopeView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
     // TODO Auto-generated constructor stub 
     initCompassView(); 
    } 

    public GyroscopeView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
     initCompassView(); 
    } 

    public GyroscopeView(Context context) 
    { 
     super(context); 
     // TODO Auto-generated constructor stub 
     initCompassView(); 
    } 

    protected void initCompassView() 
    { 
     setFocusable(true); 

     Resources r = this.getResources(); 

     paintOuter = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paintOuter.setColor(Color.WHITE); 
     paintOuter.setStrokeWidth(1); 
     paintOuter.setStyle(Paint.Style.FILL_AND_STROKE); 

     paintInner = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paintInner.setColor(Color.BLUE); 
     paintInner.setStrokeWidth(1); 
     paintInner.setStyle(Paint.Style.STROKE); 

     paintDot = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paintDot.setColor(Color.RED); 
     paintDot.setStrokeWidth(1); 
     paintDot.setStyle(Paint.Style.FILL_AND_STROKE); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     // TODO Auto-generated method stub 
     super.onDraw(canvas); 

     int px = getMeasuredWidth()/2; 
     int py = getMeasuredHeight()/2; 
     radius = Math.min(px, py); 

     pointX = px; 
     pointY = py; 

     canvas.drawCircle(pointX, pointY, radius, paintOuter); 

     canvas.drawCircle(pointX, pointY, 40, paintInner); 
     canvas.drawCircle(dotX, dotY, 5, paintDot); 

    } 

    void update(float z, float yy, float xx) 
    { 

     if (yy > 0) 
     { 
      dotY = pointY - ((1 - yy) * z); 
     } else 
     { 
      dotY = pointY + ((1 - yy) * z); 
     } 
     if (xx > 0) 
     { 
      dotX = pointX - ((1 - xx) * z); 
     } else 
     { 
      dotX = pointX + ((1 - xx) * z); 
     } 
     invalidate(); 
    } 

這是我Activiy代碼。

public class GyroscopeActivity extends Activity 
{ 
    GyroscopeView gyroscopeView; 
    SensorManager sensorManager; 

    float[] gValues = new float[3]; 


    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gyroscope); 

     gyroscopeView = (GyroscopeView) findViewById(R.id.gyroscope_view); 
     initSensor(); 
    } 

    void initSensor() 
    { 
     sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     Sensor sensorGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); 
     sensorManager.registerListener(sensorGyroListener, sensorGyroscope, SensorManager.SENSOR_DELAY_UI); 
    } 

    @Override 
    protected void onStop() 
    { 
     sensorManager.unregisterListener(sensorGyroListener); 
     super.onStop(); 
    } 

    private final SensorEventListener sensorGyroListener = new SensorEventListener() 
    { 
     public void onSensorChanged(SensorEvent event) 
     { 
      if (event.sensor.getType() == Sensor.TYPE_GRAVITY) 
       gValues = event.values; 

      gyroscopeView.update(gValues[0], gValues[1], gValues[2]); 
     } 

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

希望這會幫助別人。

相關問題