日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android笔记(十九)制作一个简易的指南针

發布時間:2023/12/14 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android笔记(十九)制作一个简易的指南针 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、獲取方向的方法

Android 獲取手機旋轉的方向和角度是通過加速度傳感器和地磁傳感器共同計算得出的,這是 Android 目前推薦使用的方式。正常情況下,手機的頭部如果是正北方向,那么它圍繞Z軸的旋轉方向數值會是0。我們就可以根據手機圍繞Z軸的旋轉方向的數值來計算方位。

  • 通過SensorManager 的getRotationMatrix()方法中就可以得到一個包含旋轉矩陣的 R 數組。第一個參數 R 是一個長度為 9 的 float 數組, getRotationMatrix()方法計算出的旋轉數據就會賦值到這個數組當中。第二個參數是一個用于將地磁向量轉換成重力坐標的旋轉矩陣,通常指定為 null 即可。第三和第四個參數則分別就是加速度傳感器和地磁傳感器輸出的values 值。
  • 通過SensorManager.getOrientation()方法可以得到手機的旋轉數據,第一個參數是R數組,第二個參數是旋轉數據,values[0]記錄著手機圍繞著 Z 軸的旋轉弧度, values[1]記錄著手機圍繞 X 軸的旋轉弧度, values[2]記錄著手機圍繞 Y 軸的旋轉弧度。
  • RotateAnimation旋轉動畫效果

    RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

    第一個參數:旋轉的開始角度
    第二個參數:旋轉的結束角度
    第三個參數:X軸的伸縮模式,可以取值為ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
    第四個參數:X坐標的伸縮值。
    第五個參數:Y軸的伸縮模式,可以取值為ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
    第六個參數:Y坐標的伸縮值。

  • 二、1.建立布局

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ImageView android:id="@+id/circle"android:layout_width="250dp"android:layout_height="250dp"android:layout_centerInParent="true"android:src="@drawable/circle" /><ImageView android:id="@+id/arrow"android:layout_width="60dp"android:layout_height="110dp"android:layout_centerInParent="true"android:src="@drawable/arrow" /></RelativeLayout>

    2.MainActivity

    public class MainActivity extends ActionBarActivity {private SensorManager sensorManager;private ImageView circle;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);circle = (ImageView) findViewById(R.id.circle);sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);Sensor magnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);sensorManager.registerListener(listener, magnetic,SensorManager.SENSOR_DELAY_GAME);sensorManager.registerListener(listener, accelerometer,SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if (sensorManager != null) {sensorManager.unregisterListener(listener);}}private SensorEventListener listener = new SensorEventListener() {float[] accelerometerValues = new float[3];float[] magneticValues = new float[3];private float lastDegree;@Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {accelerometerValues = event.values.clone();} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {magneticValues = event.values.clone();}float[] R = new float[9];float[] values = new float[3];SensorManager.getRotationMatrix(R, null, accelerometerValues,magneticValues);SensorManager.getOrientation(R, values);// 將計算出的旋轉角度取反,用于旋轉指南針背景圖float rotateDegree = -(float) Math.toDegrees(values[0]);if (Math.abs(rotateDegree - lastDegree) > 1) {RotateAnimation animation = new RotateAnimation(lastDegree,rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);animation.setFillAfter(true);// 動畫執行完后是否停留在執行完的狀態circle.startAnimation(animation);lastDegree = rotateDegree;}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}};

    三、效果如圖

    完整項目代碼和apk安裝文件參考如下:
    http://download.csdn.net/detail/tomi_en/9082505

    總結

    以上是生活随笔為你收集整理的Android笔记(十九)制作一个简易的指南针的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。