Android利用Sensor(傳感器)實現(xiàn)指南針小功能
首先來說一說該指南針的實現(xiàn)思路:
程序先準(zhǔn)備一張指南針圖片,該圖片上方向指針指向北方。接下來開發(fā)一個檢測方向的傳感器,程序檢測到手機頂部繞Z軸轉(zhuǎn)過多少度,讓指南針圖片反向轉(zhuǎn)多少度即可。由此可見指南針應(yīng)用只要在界面中添加一張圖片,并讓圖片總是反向轉(zhuǎn)過反向傳感器返回的第一個角度值即可。
下面介紹一下方向傳感器:方向傳感器用于感應(yīng)手機設(shè)備的擺放狀態(tài)。方向傳感器可以返回三個角度,這三個角度即可確定手機的擺放狀態(tài)。關(guān)于方向傳感器返回的三個角度的說明如下。
第一個角度:表示手機頂部朝向正北方的夾角。當(dāng)手機繞著Z軸旋轉(zhuǎn)時,該角度值發(fā)送改變。例如當(dāng)該角度為0時,表明手機頂部朝向正北;該角度為90時,代表手機頂部朝向正東;該角度為180時,代表手機頂部朝向正南;該角度為270時,代表手機頂部朝向正西。
第二個角度:表示手機頂部或尾部翹起的角度。當(dāng)手機繞著X軸傾斜時,該角度值發(fā)送改變。該角度的取值范圍是-180~180。假設(shè)將手機屏幕朝上水平放在桌子上,如果桌子是完全水平的,該角度值應(yīng)該是0。加入從手機頂部開始抬起,直到將手機沿X軸旋轉(zhuǎn)180度(屏幕向下水平放在桌面上),在這個旋轉(zhuǎn)過程中,該角度值會從0變化為-180。也就是說,從手機頂部抬起時,該角度值會逐漸減小,直到等于-180;如果從手機底部開始抬起,知道將手機沿X軸旋轉(zhuǎn)180度(屏幕向下水平放在桌面上),該角度值會從0變化為180。也就是說,從手機頂部抬起時,該角度值會逐漸增大,直到等于180。
第三個角度:表示手機左側(cè)或右側(cè)翹起的角度。當(dāng)手機繞著Y軸傾斜時,該角度值發(fā)送改變。該角度的取值范圍是-90~90。假設(shè)將手機屏幕朝上水平放在桌子上,如果桌子是完全水平的,該角度值應(yīng)該是0。假設(shè)將手機左側(cè)逐漸抬起,知道將手機沿Y軸旋轉(zhuǎn)90度(手機與桌面垂直),在這個旋轉(zhuǎn)過程中,該角度值會從0變化為-90。也就是說,從手機左側(cè)抬起時,該角度值會逐漸減小,直到等于-90;如果將手機右側(cè)逐漸抬起,知道將手機沿Y軸旋轉(zhuǎn)90度(手機與桌面垂直),在這個旋轉(zhuǎn)過程中,該角度值會從0變化為90。也就是說,從手機右側(cè)抬起時,該角度值會逐漸增大,直到等于90。
step1:新建一個項目Compass,并將一張指南針圖片導(dǎo)入到res/drawable-hdpi目錄中

compass.png

step2:設(shè)計應(yīng)用的UI界面,main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/compass" android:id="@+id/imageView" /> </LinearLayout>
step3:MainActivity.java
package cn.roco.sensor;
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.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView imageView;
/** 傳感器管理器 */
private SensorManager manager;
private SensorListener listener = new SensorListener();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) this.findViewById(R.id.imageView);
imageView.setKeepScreenOn(true);//屏幕高亮
//獲取系統(tǒng)服務(wù)(SENSOR_SERVICE)返回一個SensorManager 對象
manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
@Override
protected void onResume() {
/**
* 獲取方向傳感器
* 通過SensorManager對象獲取相應(yīng)的Sensor類型的對象
*/
Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//應(yīng)用在前臺時候注冊監(jiān)聽器
manager.registerListener(listener, sensor,
SensorManager.SENSOR_DELAY_GAME);
super.onResume();
}
@Override
protected void onPause() {
//應(yīng)用不在前臺時候銷毀掉監(jiān)聽器
manager.unregisterListener(listener);
super.onPause();
}
private final class SensorListener implements SensorEventListener {
private float predegree = 0;
@Override
public void onSensorChanged(SensorEvent event) {
/**
* values[0]: x-axis 方向加速度
values[1]: y-axis 方向加速度
values[2]: z-axis 方向加速度
*/
float degree = event.values[0];// 存放了方向值
/**動畫效果*/
RotateAnimation animation = new RotateAnimation(predegree, degree,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animation.setDuration(200);
imageView.startAnimation(animation);
predegree=-degree;
/**
float x=event.values[SensorManager.DATA_X];
float y=event.values[SensorManager.DATA_Y];
float z=event.values[SensorManager.DATA_Z];
Log.i("XYZ", "x="+(int)x+",y="+(int)y+",z="+(int)z);
*/
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
}
step4:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.roco.sensor" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
step5:部署應(yīng)用到真機環(huán)境中 就可以查看運行的效果啦!
我的Android進階之旅------>Android利用Sensor(傳感器)實現(xiàn)水平儀功能的小例
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實現(xiàn)網(wǎng)絡(luò)圖片瀏覽功能
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)網(wǎng)絡(luò)圖片瀏覽功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
替換so文件來動態(tài)替換Flutter代碼實現(xiàn)詳解
這篇文章主要為大家介紹了替換so文件來動態(tài)替換Flutter代碼實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
安卓(Android)中如何實現(xiàn)滑動導(dǎo)航
導(dǎo)航是移動應(yīng)用最重要的方面之一,對用戶體驗是良好還是糟糕起著至關(guān)重要的作用。好的導(dǎo)航可以讓一款應(yīng)用更加易用并且讓用戶快速上手。相反,糟糕的應(yīng)用導(dǎo)航很容易讓人討厭,并遭到用戶的拋棄。2014-08-08
通過FancyView提供 Android 酷炫的開屏動畫實例代碼
這篇文章主要介紹了通過FancyView提供 Android 酷炫的開屏動畫的實現(xiàn)代碼,需要的朋友可以參考下2017-12-12
Kotlin實現(xiàn)在類里面創(chuàng)建main函數(shù)
這篇文章主要介紹了Kotlin實現(xiàn)在類里面創(chuàng)建main函數(shù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android組件實現(xiàn)長按彈出上下文菜單功能的方法
這篇文章主要介紹了Android組件實現(xiàn)長按彈出上下文菜單功能的方法,結(jié)合實例形式分析了Android實現(xiàn)長按彈出上下文菜單的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
使用Kotlin+RocketMQ實現(xiàn)延時消息的示例代碼
這篇文章主要介紹了使用Kotlin+RocketMQ實現(xiàn)延時消息的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Android 如何實現(xiàn)動態(tài)申請權(quán)限
這篇文章主要介紹了Android 如何實現(xiàn)動態(tài)申請權(quán)限。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

