基于Android嵌入式平臺(tái)傳感器應(yīng)用開發(fā)水平儀
inttempy=(int)(y+mv。zhongBitmap2。getWidth()/2。0);
本文引用地址:http://m.butianyuan.cn/article/149233.htmintox=(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所示的效果,通過(guò)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é)語(yǔ)
通過(guò)開發(fā)基于Android平臺(tái)的傳感器應(yīng)用---水平儀程序,讀者應(yīng)該對(duì)Android程序的開發(fā)有了一定的了解,同時(shí)讀者也應(yīng)該了解到在Android平臺(tái)下使用傳感器來(lái)豐富自己軟件的功能是十分方便的。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論