www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]基于Android嵌入式平臺(tái)傳感器應(yīng)用開發(fā)水平儀

摘要:詳細(xì)介紹了如何利用Android系統(tǒng)的傳感器開發(fā)水平儀應(yīng)用的全過程。通過對(duì)該案例開發(fā)的講解,介紹了傳感器應(yīng)用的開發(fā)方法以及通過Eclipse開發(fā)Android應(yīng)用程序的過程。

1Android平臺(tái)簡(jiǎn)介

互聯(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)盟(OpenHandsetAlliance),發(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)傳感器、磁場(chǎng)傳感器、溫度傳感器以及光傳感器等,介紹的水平儀應(yīng)用就是使用姿態(tài)傳感器的。

2案例功能

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

2。1程序界面

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

 

圖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插件的SDKLocation。

(6)在Eclipse的AVDManager中創(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|AndroidProject進(jìn)入項(xiàng)目的創(chuàng)建界面。

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

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

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

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

圖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類,其代碼框架如下:

packagewyf。ytl;//聲明所在包

importandroid。content。Context;//引入Context類

importandroid。graphics。Bitmap;//引入Bitmap類

importandroid。graphics。BitmapFactory;//引入相關(guān)類

importandroid。graphics。Canvas;//引入Canvas類

importandroid。graphics。Color;//引入Color類

importandroid。graphics。Paint;//引入Paint類

importandroid。graphics。RectF;//引入RectF類

importandroid。graphics。Paint。Style;//引入Style類

importandroid。util。AttributeSet;//引入AttributeSet類

importandroid。view。View;//引入View類

publicclassMainViewextendsView{

Paintpaint=newPaint();//畫筆

//圖片資源的聲明

BitmapshangBitmap1;//上面的大矩形圖

BitmapshangBitmap2;//上面的氣泡

BitmapzuoBitmap1;//左面的大矩形圖

BitmapzuoBitmap2;//左面圖的氣泡

BitmapzhongBitmap1;//中間的大圓圖

BitmapzhongBitmap2;//中間的小氣泡

BitmapxiaBitmap1;//右下的矩形圖[!--empirenews.page--]

BitmapxiaBitmap2;//右下的氣泡

//背景矩形的位置聲明

intshang1_X=60;//上面的大矩形圖

intshang1_Y=12;

intzuo1_X=12;//左面的大矩形圖

intzuo1_Y=60;

intzhong1_X=65;//中間的大圓圖

intzhong1_Y=65;

intxia1_X=145;//右下的矩形圖

intxia1_Y=145;//水泡的位置聲明

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

intshang2_Y;

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

intzuo2_Y;

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

intzhong2_Y;

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

intxia2_Y;

publicMainView(Contextcontext,AttributeSetattrs){

super(context,attrs);

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

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

}

privatevoidinitBitmap(){//初始化圖片的方法

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

}

privatevoidinitLocation(){//初始化氣泡位置的方法

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

}

@Override

protectedvoidonDraw(Canvascanvas){//重寫的繪制方法

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è)方法中的代碼都不是很長(zhǎng),會(huì)大大提高代碼的可讀性以及可維護(hù)性。

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

privatevoidinitBitmap(){//初始化圖片資源的方法

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ā)了,其代碼如下:

privatevoidinitLocation(){//初始化氣泡位置的方法

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

protectedvoidonDraw(Canvascanvas){//界面繪制方法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);[!--empirenews.page--]

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

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);

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

RectFoval=newRectF(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代碼:

<?xmlversion="1。0"encoding="utf-8"?><!--編碼格式-->

 

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-->

</LinearLayout>

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

<?xmlversion="1。0"encoding="utf-8"?><!--編碼方式-->

水平儀

在該文件中只是對(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)限。

7Activity類的開發(fā)

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

packagewyf。ytl;//聲明所在包

importandroid。app。Activity;//引入相關(guān)類

importandroid。hardware。SensorListener;

importandroid。hardware。SensorManager;

importandroid。os。Bundle;

publicclassSPYActivityextendsActivity{//繼承ActivityMainViewmv;//主View

intk=45;//靈敏度

//SensorManagermySensorManager;

//真機(jī)

SensorManagerSimulatormySensorManager;//測(cè)試時(shí)@Override

publicvoidonCreate(BundlesavedInstanceState){super。onCreate(savedInstanceState);

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

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

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

mySensorManager。connectSimulator();//測(cè)試時(shí)

//mySensorManager=(SensorManager)

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

}

privatefinalSensorListenermSensorLisener=newSensorListener(){//傳感器監(jiān)聽

//器類

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

};

@Override

protectedvoidonResume(){//添加監(jiān)聽

mySensorManager。registerListener(mSensorLisener,SensorManager。SENSOR_ORIENTATION);

super。onResume();

}

@Override

protectedvoidonPause(){//取消監(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)聽器類的代碼框架:

privatefinalSensorListenermSensorLisener=

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

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

}

@Override

publicvoidonAccuracyChanged(intsensor,intaccuracy){}

publicbooleanisContain(intx,inty){//判斷點(diǎn)是否在圓內(nèi)

inttempx=(int)(x+mv。zhongBitmap2。getWidth()/2。0);

[!--empirenews.page--]

inttempy=(int)(y+mv。zhongBitmap2。getWidth()/2。0);

intox=(int)(mv。zhong1_X+mv。zhongBitmap1。getWidth()/2。0);

intoy=(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)returnfalse;

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

returntrue;

}

}

};

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

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

publicvoidonSensorChanged(intsensor,float[]values){

if(sensor==SensorManager。SENSOR_ORIENTATION){

doublepitch=values[SensorManager。DATA_Y];

doubleroll=values[SensorManager。DATA_Z];

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

inttempX=0;inttempY=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);

}elseif(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);

}elseif(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)行該程序,并保證測(cè)試工具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ā)布之前首先需要將代碼中注釋為"測(cè)試時(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)下使用傳感器來豐富自己軟件的功能是十分方便的。[!--empirenews.page--]

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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉