Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 安卓驅動陀螺儀代碼,安卓陀螺儀代碼

安卓驅動陀螺儀代碼,安卓陀螺儀代碼

編輯:關於android開發

安卓驅動陀螺儀代碼,安卓陀螺儀代碼


 

安卓驅動陀螺儀代碼:

來源http://www.cnblogs.com/xiaobo-Linux/ qq463431476

package zcd.functions;

import zcd.netanything.R;
import android.app.Fragment;
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.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class VR extends Fragment implements SensorEventListener {

    
 
   private SensorManager sensorManager;
    private Sensor magneticSensor;
    private TextView showTextView;
    private Sensor accelerometerSensor;
    private Sensor gyroscopeSensor;
    // 將納秒轉化為秒
    private static final float NS2S = 1.0f / 1000000000.0f;
    private float timestamp;
    private float angle[] = new float[3];

  public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
     View view = inflater.inflate(R.layout.vr,container, false);
     showTextView  = (TextView)view.findViewById(R.id.text);
     
    return view;
     }
     
       public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
        magneticSensor = sensorManager
                .getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        accelerometerSensor = sensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        gyroscopeSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        //注冊陀螺儀傳感器,並設定傳感器向應用中輸出的時間間隔類型是SensorManager.SENSOR_DELAY_GAME(20000微秒)
        //SensorManager.SENSOR_DELAY_FASTEST(0微秒):最快。最低延遲,一般不是特別敏感的處理不推薦使用,該模式可能在成手機電力大量消耗,由於傳遞的為原始數據,訴法不處理好會影響游戲邏輯和UI的性能
        //SensorManager.SENSOR_DELAY_GAME(20000微秒):游戲。游戲延遲,一般絕大多數的實時性較高的游戲都是用該級別
        //SensorManager.SENSOR_DELAY_NORMAL(200000微秒):普通。標准延時,對於一般的益智類或EASY級別的游戲可以使用,但過低的采樣率可能對一些賽車類游戲有跳幀現象
        //SensorManager.SENSOR_DELAY_UI(60000微秒):用戶界面。一般對於屏幕方向自動旋轉使用,相對節省電能和邏輯處理,一般游戲開發中不使用
         sensorManager.registerListener(this, gyroscopeSensor,
                SensorManager.SENSOR_DELAY_GAME);
         sensorManager.registerListener(this, magneticSensor,
         SensorManager.SENSOR_DELAY_GAME);
         sensorManager.registerListener(this, accelerometerSensor,
         SensorManager.SENSOR_DELAY_GAME);
  }

      //坐標軸都是手機從左側到右側的水平方向為x軸正向,從手機下部到上部為y軸正向,垂直於手機屏幕向上為z軸正向
        @Override
        public void onSensorChanged(SensorEvent event) {

            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                // x,y,z分別存儲坐標軸x,y,z上的加速度
                float x = event.values[0];
                float y = event.values[1];
                float z = event.values[2];
                // 根據三個方向上的加速度值得到總的加速度值a
                float a = (float) Math.sqrt(x * x + y * y + z * z);
                System.out.println("a---------->" + a);
                // 傳感器從外界采集數據的時間間隔為10000微秒
                System.out.println("magneticSensor.getMinDelay()-------->"
                        + magneticSensor.getMinDelay());
                // 加速度傳感器的最大量程
                System.out.println("event.sensor.getMaximumRange()-------->"
                        + event.sensor.getMaximumRange());
              showTextView.setText("x-->" + x + "\ny-->" +y + "\nz-->" + z);
            } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                // 三個坐標軸方向上的電磁強度,單位是微特拉斯(micro-Tesla),用uT表示,也可以是高斯(Gauss),1Tesla=10000Gauss
                float x = event.values[0];
                float y = event.values[1];
                float z = event.values[2];
                // 手機的磁場感應器從外部采集數據的時間間隔是10000微秒
                System.out.println("magneticSensor.getMinDelay()-------->"
                        + magneticSensor.getMinDelay());
                // 磁場感應器的最大量程
                System.out.println("event.sensor.getMaximumRange()----------->"
                        + event.sensor.getMaximumRange());
                System.out.println("x------------->" + x);
                System.out.println("y------------->" + y);
                System.out.println("z------------->" + z);
                //
                // Log.d("TAG","x------------->" + x);
                // Log.d("TAG", "y------------>" + y);
                // Log.d("TAG", "z----------->" + z);
                //
                // showTextView.setText("x---------->" + x + "\ny-------------->" +
                // y + "\nz----------->" + z);
            } else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
                //從 x、y、z 軸的正向位置觀看處於原始方位的設備,如果設備逆時針旋轉,將會收到正值;否則,為負值
                 if(timestamp != 0){ 
                // 得到兩次檢測到手機旋轉的時間差(納秒),並將其轉化為秒
                 final float dT = (event.timestamp - timestamp) * NS2S;
                // 將手機在各個軸上的旋轉角度相加,即可得到當前位置相對於初始位置的旋轉弧度
                 angle[0] += event.values[0] * dT;
                 angle[1] += event.values[1] * dT;
                 angle[2] += event.values[2] * dT;
                // 將弧度轉化為角度
                 float anglex = (float) Math.toDegrees(angle[0]);
                 float angley = (float) Math.toDegrees(angle[1]);
                 float anglez = (float) Math.toDegrees(angle[2]);

                 System.out.println("anglex------------>" + anglex);
                 System.out.println("angley------------>" + angley);
                 System.out.println("anglez------------>" + anglez);
                
                 System.out.println("gyroscopeSensor.getMinDelay()----------->" +
                 gyroscopeSensor.getMinDelay());
                 }
                 //將當前時間賦值給timestamp
                 timestamp = event.timestamp;

            }

        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
            sensorManager.unregisterListener(this);
        }
    }
 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved