0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Android平臺(tái)下開發(fā)傳感器應(yīng)用實(shí)現(xiàn)水平儀的功能及界面的設(shè)計(jì)

電子設(shè)計(jì) ? 來源:電腦編程技巧與維護(hù) ? 作者:蘇亞光,吳亞峰, ? 2020-03-26 07:57 ? 次閱讀

1、 Android 平臺(tái)簡介

互聯(lián)網(wǎng)巨頭Google 公司于2007 年11 月5 日推出了全新的嵌入式軟件平臺(tái)---Android, 該平臺(tái)由操作系統(tǒng)、中間件、用戶界面以及應(yīng)用軟件組成, 是一個(gè)真正開放的移動(dòng)應(yīng)用開發(fā)平臺(tái)。

2007 年11 月初, Google 與其他33 家手機(jī)廠商、軟硬件供應(yīng)商、手機(jī)芯片供應(yīng)商、移動(dòng)運(yùn)營商聯(lián)合組成了開放手機(jī)聯(lián)盟(Open Handset Alliance), 發(fā)布了名為Android 的手機(jī)軟件平臺(tái), 并宣布該平臺(tái)完全開放。同時(shí)Google 希望Android 平臺(tái)成為一套標(biāo)準(zhǔn)化、開放式的移動(dòng)嵌入式軟件平臺(tái)。

由于Android 系統(tǒng)具有開發(fā)性、平等性、無界性以及方便性等優(yōu)點(diǎn), 所以很快被業(yè)界所接受。從2008 年初開始, 越來越多的開發(fā)人員投身到Android 應(yīng)用的開發(fā)當(dāng)中。

而Android 系統(tǒng)的一大亮點(diǎn)之一就是傳感器的使用, 利用傳感器可以開發(fā)出很多新奇有趣的應(yīng)用程序。例如計(jì)步器、水平儀, 甚至在很多游戲中都可以使用傳感器來操作游戲。傳感器的種類有很多種, 其中包括加速度傳感器、姿態(tài)傳感器、磁場傳感器、溫度傳感器以及光傳感器等, 介紹的水平儀應(yīng)用就是使用姿態(tài)傳感器的。

2、 案例功能

將結(jié)合水平儀案例的開發(fā)詳細(xì)介紹如何在Android 平臺(tái)下開發(fā)傳感器應(yīng)用, 下面首先對(duì)水平儀的功能及界面進(jìn)行簡單的介紹。

2.1 程序界面

程序運(yùn)行后的效果如圖1 所示, 用戶可以通過調(diào)整手機(jī)的姿態(tài)來控制界面中各個(gè)氣泡的位置。與真正的水平儀一樣, 在使用手機(jī)水平儀時(shí), 需要將手機(jī)平放到某個(gè)平面上才可以。

如何在Android平臺(tái)下開發(fā)傳感器應(yīng)用實(shí)現(xiàn)水平儀的功能及界面的設(shè)計(jì)

圖1 水平儀應(yīng)用程序界面

2.2 軟件功能

運(yùn)行該程序, 當(dāng)改變手機(jī)的姿態(tài)時(shí), 界面中的氣泡便會(huì)根據(jù)手機(jī)的姿態(tài)向高處進(jìn)行相應(yīng)的移動(dòng)。

當(dāng)手機(jī)所處的平面水平時(shí), 各個(gè)氣泡都應(yīng)該位于中間的指定區(qū)域。

3 、開發(fā)環(huán)境搭建

正式進(jìn)入代碼開發(fā)之前, 首先需要對(duì)開發(fā)環(huán)境進(jìn)行搭建,其搭建步驟如下所列。

(1) 安裝Java 開發(fā)環(huán)境JDK.

(2) 從網(wǎng)上下載Android 開發(fā)環(huán)境SDK 的壓縮包, 并將其解壓到磁盤上的某個(gè)位置。

(3) 將SDK 解壓目錄中的tools 目錄添加到系統(tǒng)的PATH環(huán)境變量中。

(4) 下載并安裝Eclipse 集成開發(fā)環(huán)境。

(5) 為Eclipse 安裝Android 開發(fā)插件ADT, 并在Eclipse的Preferences 中配置Android 插件的SDK Location.

(6) 在Eclipse 的AVD Manager 中創(chuàng)建Android 虛擬設(shè)備(AVD), 并啟動(dòng)模擬器。

(7) 下載并安裝用來調(diào)試Android 傳感器應(yīng)用的Sensorsimulator傳感器模擬器軟件。

(8) 在模擬器中安裝Sensorsimulator 所對(duì)應(yīng)的apk 文件并對(duì)其進(jìn)行調(diào)試使Sensorsimulator 應(yīng)用程序能夠與Android 模擬器進(jìn)行通信。

4、 開發(fā)前的準(zhǔn)備

前面完成了開發(fā)環(huán)境的搭建, 但在正式進(jìn)行代碼開發(fā)之前, 還需要再做一些開發(fā)前的準(zhǔn)備工作, 其步驟如下:

(1) 首先啟動(dòng)之前安裝好Eclipse.

(2) 然后依次點(diǎn)擊File|New|Other|Android|Android Project進(jìn)入項(xiàng)目的創(chuàng)建界面。

(3) 在項(xiàng)目創(chuàng)建界面中, 輸入項(xiàng)目的名稱、所使用的目標(biāo)平臺(tái)、所在的包名等信息, 如圖2 所示。

如何在Android平臺(tái)下開發(fā)傳感器應(yīng)用實(shí)現(xiàn)水平儀的功能及界面的設(shè)計(jì)

圖2 在Eclipse 中創(chuàng)建Android 項(xiàng)目

(4) 點(diǎn)擊“Finish” 完成項(xiàng)目的創(chuàng)建。

(5) 在程序中將會(huì)用到的圖片資源存放到項(xiàng)目文件夾的res/drawable-mdpi 目錄下, 如圖3 所示。

如何在Android平臺(tái)下開發(fā)傳感器應(yīng)用實(shí)現(xiàn)水平儀的功能及界面的設(shè)計(jì)

圖3 圖片資源

(6) 為應(yīng)用程序引入調(diào)試時(shí)使用的Sensorsimulator 支持jar 包, 該jar 包位于Sensorsimulator 安裝目錄中的bin 目錄下:

5、自定義View 的開發(fā)

本案例需要自定義一個(gè)View 來繪制水平儀的用戶界面,首先需要在項(xiàng)目文件夾的src/wyf/ytl 目錄下創(chuàng)建一個(gè)名為Main-View 的java 類, 并使其繼承自View 類, 其代碼框架如下:

package wyf.ytl; //聲明所在包

import android.content.Context;//引入Context 類

import android.graphics.Bitmap; //引入Bitmap 類

import android.graphics.BitmapFactory; //引入相關(guān)類

import android.graphics.Canvas; //引入Canvas 類

import android.graphics.Color; //引入Color 類

import android.graphics.Paint; //引入Paint 類

import android.graphics.RectF; //引入RectF 類

import android.graphics.Paint.Style; //引入Style 類

import android.util.AttributeSet; //引入AttributeSet 類

import android.view.View; //引入View 類

public class MainView extends View{

Paint paint = new Paint(); //畫筆

//圖片資源的聲明

Bitmap shangBitmap1; //上面的大矩形圖

Bitmap shangBitmap2; //上面的氣泡

Bitmap zuoBitmap1; //左面的大矩形圖

Bitmap zuoBitmap2; //左面圖的氣泡

Bitmap zhongBitmap1; //中間的大圓圖

Bitmap zhongBitmap2; //中間的小氣泡

Bitmap xiaBitmap1; //右下的矩形圖

Bitmap xiaBitmap2; //右下的氣泡

//背景矩形的位置聲明

int shang1_X = 60; //上面的大矩形圖

int shang1_Y = 12;

int zuo1_X = 12; //左面的大矩形圖

int zuo1_Y = 60;

int zhong1_X = 65; //中間的大圓圖

int zhong1_Y = 65;

int xia1_X = 145; //右下的矩形圖

int xia1_Y = 145;//水泡的位置聲明

int shang2_X; //上面的氣泡XY 坐標(biāo)

int shang2_Y;

int zuo2_X; //左面圖的氣泡XY 坐標(biāo)

int zuo2_Y;

int zhong2_X; //中間的小氣泡XY 坐標(biāo)

int zhong2_Y;

int xia2_X; //右下的氣泡XY 坐標(biāo)

int xia2_Y;

public MainView(Context context, AttributeSet attrs){

super(context, attrs);

initBitmap(); //初始化圖片資源

initLocation(); //初始化氣泡的位置

}

private void initBitmap(){ //初始化圖片的方法

…//該處省略了部分代碼,將在后面進(jìn)行介紹

}

private void initLocation(){ //初始化氣泡位置的方法

…//該處省略了部分代碼,將在后面進(jìn)行介紹

}

@Override

protected void onDraw(Canvas canvas){//重寫的繪制方法

super.onDraw(canvas);

…//該處省略了部分代碼,將在后面進(jìn)行介紹

}

}

上述代碼中的initBitmap 以及initLocation 方法是對(duì)界面進(jìn)行初始化方法, 而onDraw 方法會(huì)根據(jù)需要繪制整個(gè)界面。

MainView 類構(gòu)造器中調(diào)用了兩個(gè)單獨(dú)的方法對(duì)整個(gè)界面進(jìn)行了初始化, 這是一種非常好的編程習(xí)慣。因?yàn)榘巡煌δ艿拇a各自編寫成獨(dú)立的方法可以使主邏輯清晰, 且各個(gè)方法中的代碼都不是很長, 會(huì)大大提高代碼的可讀性以及可維護(hù)性。

完成了代碼框架的開發(fā)后就可以對(duì)其中各個(gè)方法進(jìn)行開發(fā)了, 首先開發(fā)的是圖片資源的初始化方法, 其代碼如下:

private void initBitmap(){ //初始化圖片資源的方法

shangBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.shang1);

shangBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.shang2);

zuoBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.zuo1);

zuoBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.zuo2);

zhongBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.zhong1);

zhongBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.zhong2);

xiaBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.xia1);

xiaBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.xia2);

}

上述代碼為initBitmap 方法的全部代碼, 其作用是對(duì)程序中所有的圖片資源進(jìn)行初始化, 在開發(fā)該方法之前, 應(yīng)該確保所有的圖片資源已經(jīng)存放到了指定的目錄下。

完成了圖片資源初始化方法的開發(fā)后, 便可對(duì)氣泡位置初始化方法initLocation 進(jìn)行開發(fā)了, 其代碼如下:

private void initLocation(){ //初始化氣泡位置的方法

shang2_X = shang1_X + shangBitmap1.getWidth()/2- shangBitmap2.getWidth()/2;

shang2_Y = shang1_Y + shangBitmap1.getHeight()/2- shangBitmap2.getHeight()/2;

zuo2_X = zuo1_X + zuoBitmap1.getWidth()/2- zuoBitmap2.getWidth()/2;

zuo2_Y = zuo1_Y + zuoBitmap1.getHeight()/2- zuoBitmap2.getHeight()/2;

zhong2_X = zhong1_X + zhongBitmap1.getWidth()/2- zhongBitmap2.getWidth()/2;

zhong2_Y = zhong1_Y + zhongBitmap1.getHeight()/2- zhongBitmap2.getHeight()/2;

xia2_X = xia1_X + xiaBitmap1.getWidth()/2- xiaBitmap2.getWidth()/2;

xia2_Y = xia1_Y + xiaBitmap1.getHeight()/2- xiaBitmap2.getHeight()/2;

}

在該方法中通過相應(yīng)圖片的寬度和高度動(dòng)態(tài)計(jì)算氣泡的初始坐標(biāo), 采用此方法動(dòng)態(tài)計(jì)算氣泡坐標(biāo)的好處是當(dāng)日后更改圖片資源后, 不需要重寫修改源代碼即可正常運(yùn)行, 大大提高了程序的可維護(hù)性。

在完成了各個(gè)初始化方法的開發(fā)后就可以對(duì)繪制方法onDraw 進(jìn)行開發(fā), 該方法主要負(fù)責(zé)界面的繪制工作, 其代碼如下:

@Override

protected void onDraw(Canvas canvas){//界面繪制方法super.onDraw(canvas);

canvas.drawColor(Color.WHITE); //設(shè)置背景色為白色

paint.setColor(Color.BLUE); //設(shè)置畫筆顏色

paint.setStyle(Style.STROKE); //設(shè)置畫筆為不填充

canvas.drawRect(5, 5, 315, 315, paint);//繪制外邊框矩形

//畫背景矩形

canvas.drawBitmap(shangBitmap1, shang1_X,shang1_Y, paint); //上

canvas.drawBitmap(zuoBitmap1, zuo1_X,zuo1_Y, paint); //左

canvas.drawBitmap(zhongBitmap1, zhong1_X,zhong1_Y, paint); //中

canvas.drawBitmap(xiaBitmap1, xia1_X,xia1_Y, paint); //下

//開始繪制氣泡

canvas.drawBitmap(shangBitmap2, shang2_X,shang2_Y, paint); //上

canvas.drawBitmap(zuoBitmap2, zuo2_X,zuo2_Y, paint); //左

canvas.drawBitmap(zhongBitmap2, zhong2_X,zhong2_Y, paint); //中

canvas.drawBitmap(xiaBitmap2, xia2_X, xia2_Y, paint);//下

paint.setColor(Color.GRAY);//設(shè)置畫筆顏色用來繪制刻度

//繪制上面方框中的刻度

canvas.drawLine (shang1_X+shangBitmap1.getWidth()/2-7,shang1_Y, shang1_X+shangBitmap1.getWidth()/2-7,shang1_Y+shangBitmap1.getHeight()-2, paint);

canvas.drawLine (shang1_X+shangBitmap1.getWidth()/2+7,shang1_Y, shang1_X+shangBitmap1.getWidth()/2+7,shang1_Y+shangBitmap1.getHeight()-2, paint);

//繪制左面方框中的刻度

canvas.drawLine(zuo1_X,zuo1_Y+zuoBitmap1.getHeight()/2-7,zuo1_X+zuoBitmap1.getWidth()-2,zuo1_Y+zuoBitmap1.getHeight()/2-7, paint);canvas.drawLine(zuo1_X,zuo1_Y+zuoBitmap1.getHeight()/2+7,zuo1_X+zuoBitmap1.getWidth()-2,zuo1_Y+zuoBitmap1.getHeight()/2+7, paint);

//繪制下面方框中的刻度

canvas.drawLine(xia1_X+xiaBitmap1.getWidth()/2-10,xia1_Y+xiaBitmap1.getHeight()/2-20,xia1_X+xiaBitmap1.getWidth()/2+20,xia1_Y+xiaBitmap1.getHeight()/2+10, paint);

canvas.drawLine(xia1_X+xiaBitmap1.getWidth()/2-20,xia1_Y+xiaBitmap1.getHeight()/2-10,xia1_X+xiaBitmap1.getWidth()/2+10,xia1_Y+xiaBitmap1.getHeight()/2+20, paint);

//中間圓圈中的刻度(小圓)

RectF oval = new RectF(zhong1_X+zhongBitmap1.getWidth()/2-10,zhong1_Y+zhongBitmap1.getHeight()/2-10,zhong1_X+zhongBitmap1.getWidth()/2+10,zhong1_Y+zhongBitmap1.getHeight()/2+10);

canvas.drawOval(oval, paint);//繪制基準(zhǔn)線(圓)

}

在該方法中, 根據(jù)相應(yīng)圖片的X、Y 坐標(biāo)將圖片繪制到屏幕中, 在圖片的繪制過程中, 同樣動(dòng)態(tài)根據(jù)相應(yīng)圖片的寬和高計(jì)算需要繪制到的位置坐標(biāo), 以提高程序的可維護(hù)性與靈活性。

6、 相關(guān)XML 文件的編寫

完成了用于顯示水平儀界面的自定義View 的Java 代碼開發(fā)之后, 就應(yīng)該對(duì)布局XML 資源文件進(jìn)行編寫, 以將之前開發(fā)的自定義View 添加到用戶界面中。打開項(xiàng)目中res/layout 目錄下的main.xml, 在其中編寫如下的xml 代碼:

android:orientation=“vertical”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”》

android:id=“@+id/mainView”

android:layout_width=“fill_parent”

android:layout_height = “fill_parent”/》《 ! -- 自定義

View--》

編寫完布局文件main.xml 后, 還需要開發(fā)字符串資源文件strings.xml.打開res/values 下的strings.xml 文件, 編寫如下的代碼:

如何在Android平臺(tái)下開發(fā)傳感器應(yīng)用實(shí)現(xiàn)水平儀的功能及界面的設(shè)計(jì)

在該文件中只是對(duì)字符串a(chǎn)pp_name 進(jìn)行了定義, 在開發(fā)Android 應(yīng)用程序時(shí), 將字符串資源統(tǒng)一定義到一個(gè)xml 文件中是一個(gè)很好的編程習(xí)慣。

編寫完上述的xml 資源文件后, 為了調(diào)試還需要為此應(yīng)用程序添加網(wǎng)絡(luò)權(quán)限, 打開項(xiàng)目根目錄下的AndroidManifest.xml文件, 在“” 標(biāo)簽之前加入下列代碼:

上述代碼的功能為此應(yīng)用程序添加了訪問網(wǎng)絡(luò)的權(quán)限。

7 、Activity 類的開發(fā)

完成了自定義View 以及XML 文件的開發(fā)后, 就可以對(duì)用戶界面對(duì)應(yīng)的Activity 類進(jìn)行開發(fā), 首先開發(fā)該類的代碼框架,其代碼如下:

package wyf.ytl; //聲明所在包

import android.app.Activity; //引入相關(guān)類

import android.hardware.SensorListener;

import android.hardware.SensorManager;

import android.os.Bundle;

public class SPYActivity extends Activity { //繼承Activity MainView mv; //主View

int k = 45; //靈敏度

//SensorManager mySensorManager;

//真機(jī)

SensorManagerSimulator mySensorManager; //測試時(shí)@Override

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.main);//設(shè)置當(dāng)前用戶界面

mv = (MainView) findViewById(R.id.mainView);

mySensorManager =SensorManagerSimulator.getSystemService(this,SENSOR_SERVICE); //測試時(shí)

mySensorManager.connectSimulator();//測試時(shí)

//mySensorManager = (SensorManager)

// getSystemService(SENSOR_SERVICE);//真機(jī)

}

private final SensorListener mSensorLisener =new SensorListener(){ //傳感器監(jiān)聽

//器類

…//該處省略了部分代碼,將在后面進(jìn)行介紹

};

@Override

protected void onResume(){ //添加監(jiān)聽

mySensorManager.registerListener(mSensorLisener,SensorManager.SENSOR_ORIENTATION);

super.onResume();

}

@Override

protected void onPause() { //取消監(jiān)聽

mySensorManager.unregisterListener (mSensorLisener);

super.onPause();

}

}

上述代碼中除了重寫了onCreate 方法外, 還重寫了onRe-sume 以及onPause 方法為mySensorManager 添加或刪除監(jiān)聽,并且定義了傳感器監(jiān)聽器類mSensorLisener.

在完成了Activity 類代碼框架的開發(fā)后就可以對(duì)其中傳感器的監(jiān)聽類進(jìn)行開發(fā), 首先給出監(jiān)聽器類的代碼框架:

private final SensorListener mSensorLisener =

new SensorListener(){//傳感器監(jiān)聽器類

public void onSensorChanged(int sensor, float[] values){…//該處省略了部分代碼,將在后面進(jìn)行介紹

}

@Override

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

public boolean isContain(int x, int y){//判斷點(diǎn)是否在圓內(nèi)

int tempx =(int) (x + mv.zhongBitmap2.getWidth()/2.0);

int tempy =(int) (y + mv.zhongBitmap2.getWidth()/2.0);

int ox = (int) (mv.zhong1_X+ mv.zhongBitmap1.getWidth()/2.0);

int oy = (int) (mv.zhong1_X+ mv.zhongBitmap1.getWidth()/2.0);

if(Math.sqrt((tempx-ox)*(tempx-ox)+(tempy-oy)*(tempy-oy))》(mv.zhongBitmap1.getWidth()/2.0-mv.zhongBitmap2.getWidth()/2.0)){//不在圓內(nèi)return false;

}else{ //在圓內(nèi)時(shí)

return true;

}

}

};

在傳感器監(jiān)聽類中, onSensorChanged 方法用于監(jiān)聽傳感器采樣值的變化, 例如手機(jī)姿態(tài)的改變等。上述代碼中的is-Contain 方法用于判斷界面中間的氣泡是否出界, 若出界則返回false.

完成了代碼框架的開發(fā)后, 便可以對(duì)傳感器的監(jiān)聽方法onSensorChanged 進(jìn)行開發(fā)了, 其詳細(xì)代碼如下:

public void onSensorChanged(int sensor, float[] values){

if(sensor == SensorManager.SENSOR_ORIENTATION){

double pitch = values[SensorManager.DATA_Y];

double roll = values[SensorManager.DATA_Z];

int x=0; int y=0;//臨時(shí)變量,算中間水泡坐標(biāo)時(shí)用

int tempX=0; int tempY=0;//下面氣泡的臨時(shí)變量

//開始調(diào)整x 的值

if(Math.abs(roll)《=k){

mv.shang2_X = mv.shang1_X //上面的

+ (int)(((mv.shangBitmap1.getWidth()

-mv.shangBitmap2.getWidth())/2.0)

-(((mv.shangBitmap1.getWidth()

-mv.shangBitmap2.getWidth())/2.0)*roll)/k);

x = mv.zhong1_X //中間的

+ (int)(((mv.zhongBitmap1.getWidth()

-mv.zhongBitmap2.getWidth())/2.0)

-(((mv.zhongBitmap1.getWidth()

-mv.zhongBitmap2.getWidth())/2.0)*roll)/k);

}else if(roll》k){

mv.shang2_X=mv.shang1_X; x = mv.zhong1_X;

}else{

mv.shang2_X=mv.shang1_X+

mv.shangBitmap1.getWidth()

- mv.shangBitmap2.getWidth();

x = mv.zhong1_X+ mv.zhongBitmap1.getWidth()

- mv.zhongBitmap2.getWidth();

}

//開始調(diào)整y 的值

if(Math.abs(pitch)《=k){

mv.zuo2_Y=mv.zuo1_Y //左面的

+ (int)(((mv.zuoBitmap1.getHeight()

-mv.zuoBitmap2.getHeight())/2.0)

+(((mv.zuoBitmap1.getHeight()

-mv.zuoBitmap2.getHeight())/2.0)*pitch)/k);

y =mv.zhong1_Y+ //中間的

(int)(((mv.zhongBitmap1.getHeight()

-mv.zhongBitmap2.getHeight())/2.0)

+(((mv.zhongBitmap1.getHeight()

-mv.zhongBitmap2.getHeight())/2.0)*pitch)/k);

}else if(pitch》k){

mv.zuo2_Y=mv.zuo1_Y

+mv.zuoBitmap1.getHeight()

-mv.zuoBitmap2.getHeight();

y=mv.zhong1_Y+mv.zhongBitmap1.getHeight()

-mv.zhongBitmap2.getHeight();

}else{

mv.zuo2_Y = mv.zuo1_Y; y = mv.zhong1_Y;

}

//下面的

tempX = -(int) (((mv.xiaBitmap1.getWidth()/2-28)*roll

+(mv.xiaBitmap1.getWidth()/2-28)*pitch)/k);

tempY = -(int) ((-(mv.xiaBitmap1.getWidth()/2-28)*roll

-(mv.xiaBitmap1.getWidth()/2-28)*pitch)/k);

//限制下面的氣泡范圍

if(tempY》mv.xiaBitmap1.getHeight()/2-28){

tempY = mv.xiaBitmap1.getHeight()/2-28;

}

if(tempY 《 -mv.xiaBitmap1.getHeight()/2+28){

tempY = -mv.xiaBitmap1.getHeight()/2+28;

}

if(tempX 》 mv.xiaBitmap1.getWidth()/2-28){

tempX = mv.xiaBitmap1.getWidth()/2-28;

}

if(tempX 《 -mv.xiaBitmap1.getWidth()/2+28){

tempX = -mv.xiaBitmap1.getWidth()/2+28;

}

mv.xia2_X = tempX + mv.xia1_X

+ mv.xiaBitmap1.getWidth()/2

-mv.xiaBitmap2.getWidth()/2;

mv.xia2_Y = tempY + mv.xia1_Y

+ mv.xiaBitmap1.getHeight()/2

- mv.xiaBitmap2.getWidth()/2;

if(isContain(x, y)){//中間的水泡在圓內(nèi)才改變坐標(biāo)

mv.zhong2_X = x; mv.zhong2_Y = y;

}

mv.postInvalidate();//重繪MainView

}

}

在onSensorChanged 方法中首先得到pitch 軸以及roll 軸的數(shù)值, 然后根據(jù)該數(shù)值的大小調(diào)整水泡在屏幕中的位置, 同時(shí)需要對(duì)水泡的坐標(biāo)進(jìn)行判斷, 使其保持在自身所在外框的范圍內(nèi)。

此時(shí)運(yùn)行該程序, 并保證測試工具Sensorsimulator 與Android模擬器的連通, 便會(huì)觀察到如圖1 所示的效果, 通過Sensorsimulator 工具模擬手機(jī)的姿態(tài)的改變, 屏幕中的水泡便隨之向高處運(yùn)動(dòng)。

8、 程序發(fā)布

完成了所有代碼的開發(fā)后, 就可以將應(yīng)用程序打包發(fā)布了。本案例中只需將Eclipse 工具自動(dòng)生成的apk 文件拷出即可, 按如下步驟操作。

(1) 進(jìn)行正式發(fā)布之前首先需要將代碼中注釋為“測試時(shí)使用” 的兩處代碼刪掉, 并將注釋為“真機(jī)使用” 代碼的注釋去掉。

(2) 完成代碼的修改后重新構(gòu)建項(xiàng)目。

(3) 打開項(xiàng)目文件夾下的bin 目錄, 其中名為SPY 的apk文件便為本應(yīng)用程序的安裝包。

(4) 將SPY.apk 文件拷貝到支持傳感器的Android 手機(jī)中運(yùn)行即可完成本應(yīng)用程序的安裝。

9 、結(jié)語

通過開發(fā)基于Android 平臺(tái)的傳感器應(yīng)用---水平儀程序, 讀者應(yīng)該對(duì)Android 程序的開發(fā)有了一定的了解, 同時(shí)讀者也應(yīng)該了解到在Android 平臺(tái)下使用傳感器來豐富自己軟件的功能是十分方便的。

另外, 本案例雖然只對(duì)姿態(tài)傳感器進(jìn)行了應(yīng)用, 但相信通過對(duì)本案例的學(xué)習(xí), 讀者已經(jīng)有能力對(duì)其他傳感器進(jìn)行應(yīng)用,開發(fā)出更具新意的吸引人的其他應(yīng)用程序。

責(zé)任編輯:gt


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2546

    文章

    50494

    瀏覽量

    751191
  • 嵌入式
    +關(guān)注

    關(guān)注

    5060

    文章

    18979

    瀏覽量

    302237
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3917

    瀏覽量

    127061
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Android傳感器開發(fā)水平儀

    詳細(xì)介紹了如何利用Android 系統(tǒng)的傳感器開發(fā)水平儀應(yīng)用的全過程。
    發(fā)表于 04-28 09:45 ?8103次閱讀
    <b class='flag-5'>Android</b>的<b class='flag-5'>傳感器</b><b class='flag-5'>開發(fā)水平儀</b>

    原裝進(jìn)口Digi-Pas/迪派士數(shù)顯電子水平儀

    產(chǎn)品資訊世界首創(chuàng)二維超精密數(shù)碼水平儀/傾角-DWL-8500XYDigi-Pas? DWL-8500XY是一款二維超精密數(shù)碼水平儀/傾角
    發(fā)表于 02-26 15:23

    【OK210申請(qǐng)】物聯(lián)網(wǎng)智能水平儀

    ,結(jié)合物聯(lián)網(wǎng)相關(guān)技術(shù),擬設(shè)計(jì)并開發(fā)一款集水平測量,自動(dòng)校正,傾角調(diào)整為一體的低功耗自平衡水準(zhǔn).本作品是基于傳感器、模擬信號(hào)處理、單片機(jī)技術(shù)的數(shù)字
    發(fā)表于 07-05 22:57

    基于Android移動(dòng)設(shè)備的傳感器技術(shù)應(yīng)用研究

    ,Google公司強(qiáng)大的互聯(lián)網(wǎng)功能和服務(wù)優(yōu)勢(shì),Android的移動(dòng)技術(shù)應(yīng)用的前景非常美好?! 。ǘ┗?b class='flag-5'>Android平臺(tái)傳感器概述  
    發(fā)表于 11-06 15:49

    差動(dòng)電容式傳感器在智能電子水平儀中的應(yīng)用

    提出了差動(dòng)式傾角電容傳感器在分辨力為0. 001 mm/ m 的智能電子水平儀的應(yīng)用方案,采用ICL8038 集成芯片作為差動(dòng)電容電橋的激勵(lì)電源,使用兩片LF398 同時(shí)對(duì)兩路電壓進(jìn)行采樣及AD7706 對(duì)
    發(fā)表于 06-22 13:53 ?46次下載

    數(shù)字水平儀的設(shè)計(jì)與應(yīng)用

    高精度低功耗數(shù)字水平儀的設(shè)計(jì)原理,敘述了其關(guān)鍵芯片ADXL202的結(jié)構(gòu)和原理以及使用方法,給出了詳細(xì)的設(shè)計(jì)電路圖和程序流程。關(guān)鍵詞: 高精度 微功耗 ADXL202 數(shù)字水平儀
    發(fā)表于 08-25 14:59 ?49次下載

    基于數(shù)字電位的電子水平儀自動(dòng)調(diào)零方法

    零點(diǎn)漂移是所有傳感儀表都必須考慮的一個(gè)問題,本文基于所設(shè)計(jì)的電子水平儀,提出了一種用單片機(jī)控制數(shù)字電位實(shí)現(xiàn)水平儀自動(dòng)調(diào)零的方法,并給出了硬
    發(fā)表于 09-01 09:00 ?26次下載

    Android平臺(tái)下傳感器技術(shù)開發(fā)研究

    通過開發(fā)計(jì)步器應(yīng)用程序,對(duì)Android平臺(tái)下開發(fā)傳感器應(yīng)用的流程有了一定的了解。傳感器的特性和
    發(fā)表于 08-29 16:47 ?89次下載
    <b class='flag-5'>Android</b><b class='flag-5'>平臺(tái)下傳感器</b>技術(shù)<b class='flag-5'>開發(fā)</b>研究

    基于差動(dòng)電容傳感器和89C51單片機(jī)的電子水平儀

    針對(duì)原有的氣泡式水平儀功能存在的不足進(jìn)行了改進(jìn),改進(jìn)后的儀器采用了變介質(zhì)差動(dòng)電容傳感器,設(shè)計(jì)了電容傳感器變換電路,將傳感器電容的變化轉(zhuǎn)換為信
    發(fā)表于 09-06 14:34 ?169次下載
    基于差動(dòng)電容<b class='flag-5'>傳感器</b>和89C51單片機(jī)的電子<b class='flag-5'>水平儀</b>

    聲音水平儀電路

    聲音水平儀電路使用LM3915 VU表LED柵極驅(qū)動(dòng)可以驅(qū)動(dòng)十個(gè)LED燈。一個(gè)簡單的音頻放大驅(qū)動(dòng)電路,為LM3915提供直流驅(qū)動(dòng)。
    發(fā)表于 12-22 16:26 ?2904次閱讀
    聲音<b class='flag-5'>水平儀</b>電路

    傾角傳感器的應(yīng)用

    傾角傳感器的應(yīng)用領(lǐng)域 傾角傳感器又稱作傾斜、測斜、水平儀、傾角計(jì),經(jīng)常用于系統(tǒng)的水平角度變化
    發(fā)表于 03-18 17:12 ?2323次閱讀

    高精度傾角傳感器的應(yīng)用-傳感器

    高精度傾角傳感器的應(yīng)用 傾角傳感器的應(yīng)用領(lǐng)域傾角傳感器又稱作傾斜、測斜水平儀、傾角計(jì),經(jīng)常
    發(fā)表于 04-26 14:55 ?1835次閱讀

    傾角傳感器的應(yīng)用有哪些

    傾角傳感器又稱作傾斜、測斜水平儀、傾角計(jì),經(jīng)常用于系統(tǒng)的水平角度變化測量,水平儀從過去簡單
    發(fā)表于 07-17 17:55 ?4410次閱讀

    使用軸角度傳感器制作的水平儀程序和工程文件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用軸角度傳感器制作的水平儀程序和工程文件免費(fèi)下載,12864顯示,軟件提高穩(wěn)定性。
    發(fā)表于 09-14 08:00 ?1次下載
    使用軸角度<b class='flag-5'>傳感器</b>制作的<b class='flag-5'>水平儀</b>程序和工程文件免費(fèi)下載

    電子水平儀開源分享

    電子發(fā)燒友網(wǎng)站提供《電子水平儀開源分享.zip》資料免費(fèi)下載
    發(fā)表于 10-28 09:53 ?2次下載
    電子<b class='flag-5'>水平儀</b>開源分享