羅盤,估計也不用我過多介紹,學過初中物理的都知道,不管是指南針,還是指北針,其本質就是用來辨別方向的。
操作電子羅盤偉感器也不複雜,主要就是兩個角度:
1、當前方向與磁北的夾角;
2、當前方向與地北的夾角。
同時,我們也了解到,地理北極與地磁北極並不是重合的,存在地偏角。在讀取電子羅盤資料時,可以優先考慮讀取與地北極的夾角,如果讀不到地北極的夾角,再讀取磁北極的夾角資料。
compassreading類(位於windows.devices.sensors命名空間)封裝了從電子羅盤所讀到的資料。
1、headingmagneticnorth屬性:獲取當前方向與磁北的夾角度數。
2、headingtruenorth屬性:該屬性獲取的是真北夾角,即地理夾角。我們注意到它的型別為double?,即nullable,表明這個數值有可能為null,也就是說有可能獲取不到地北夾角的值。在使用時,我們可以先判斷地北角是否為null,如不為null就用這個值;如果為null就用磁北角的值。
3、headingaccuracy屬性:表示羅盤讀數的準確性,如果讀數精度較高,其返回high。我們的應用程式可以在合適的時候檢查這個屬性是否為high,如果不是,可以考慮提示使用者校準羅盤。
提到校準,不得不說一下的是,校準羅盤是不需要系統提示,應用也可以不提示。只是考慮到使用者體驗的問題,可以提示使用者校準。校準方法很簡單,不管你是使用wp自帶的地圖應用,還是其他第三方應用,或者你自己開發的應用。只要在使用到羅盤的地方,你拿著手機,在空中做幾次「8」字形來回移動就可以了,不需要等待提示,只要在用到羅盤的地方就可以隨時校準
。電子羅盤的api封裝在windows.devices.sensors.compass類中,wp api中的所有感測器呼叫都很簡單,首先獲取到某個感測器類的例項,一般通過getdefault方法(靜態方法)就能返回,然後設定讀取的時間間隔,以毫秒為單位,如果你希望每秒讀一次資料,就把reportinterval設定為1000,但是,這個時間間隔不能小於minimumreportinterval屬性指定的值,這個要注意,設定為20毫秒以上的間隔,效果都不錯了,當然這要看你使用的實際情況了。
最後處理readingchanged事件,當有新的資料讀到時,會引發該事件,並把新讀到的資料傳遞給該事件,我們就可以從事件引數中獲取最新的讀數。
好了,理論永遠都是抽象的,下面給大家看一下我做的乙個簡陋指南針,確實很簡,希望大家莫笑,因為本人較菜,所以連主頁上的羅盤也是用xaml直接畫的。
先上乙個效果圖。
看吧,簡陋吧,沒辦法,人窮就是這樣,要簡食素衣。指南針背景我是用幾個圈圈畫的,指示方向的指標是用path元素畫的。
原理是這樣的:
根據電子羅盤讀到的角度,對紅色的指標物件進行旋轉變換——就是用rotatetransform類來旋轉。但要注意旋轉的角度。比如,我當前方向是20度,即東北偏北方向,那麼,要怎麼設定角度才能保證紅色的指標始終指向南方呢。
我們知道,夾角是以正北為參考的,如果要使指標指向南方,一種方法是將羅盤讀到的角度加上180,因為南北的夾角正好是180度(平角);另一種方法是,讓指標的初始位置向下,即指向正南方,我就是用這個方法的。如圖。
不管是指向北方還是南方(上北下南),都可以按相同的角度來旋轉,因為它們的夾角正好是180。
於是,第二個問題產生了——要旋轉多少度才合適?我們上面舉例說當前方向為20度,參照標準是北極,也就是說此時我們的手機已經偏向20度方向,如果把指標旋轉20度,那麼指標相對於螢幕,偏轉的角度就是40度了,本來就偏了20度,你再轉20度,就番倍了,顯然這樣不妥,我們必須把這個角度差抵消掉。
也就是說,如果我當前方向是20度,那麼指標的旋轉變換應為-20度,這樣才能把偏差的角度補平,不然的話,你試試就知道了,如果不抵消的話,指標會越走越偏。
還有一種方法就是用360度作為被減數,如360 - 20 = 340度,-20度和340度雖然計算方向不同,但它們的位置是相同的。因此兩種方法都可以。比如讀數是80度,可以把指標旋轉-80度,也可以旋轉360 - 80度。
asyncdisplay方法是我自定義的方法,用來判斷讀數所指的方向,並在頁面上以文字的方式顯示。比如,讀數為0,就是「正北」,讀數為180度,為「正南」等。void
_compass_readingchanged ( compass sender, compassreadingchangedeventargs args )
//旋轉的方向是羅盤角度的負值
rotattransform.angle = -val;
display(val);
});}
//////顯示方位
/// private
void display ( double
v )
else
if (ind == 90
)
else
if (ind == 180
)
else
if (ind == 270
)
else
if (ind > 0 && ind < 90
)
else
if (ind > 90 && ind < 180
)
else
if (ind > 180 && ind < 270
)
else
if (ind > 270 && ind < 360
)
tbw.text = string.format("
°()"
, ind, d);
}
WP 8 1開發 同時更新多種磁貼
一般應用程式都會包含多個尺寸的磁貼,如小磁貼 71 71 中磁貼 150 150 和寬磁貼 310 150 常規的磁貼更新做法是用xml文件來定義更新內容,然後再提交更新。如 以上做法是分兩次更新的,那麼,有沒有可能做到一次更新就能同時修改150x150,以及310x150兩種磁貼呢?先來分析一下,...
質問微軟 WP8 1開發HTTPS 真費勁
本人用c 多年,wpf2年,一直想做點應用為wp生態貢獻一點力量,最近終於有機會接觸了 家裡的本子是2年前的低壓i3,不支援虛擬化,一直沒有真機.最近同事媽媽換下來乙個820給我拿來做開發用,非常感謝 作為c 開發,一直被其他語言看不起,我想你們中的很多人遇到這個問題的不在少數,但是 我還是堅持下來...
WP8 1 模仿手機通訊記錄的選擇框
2016年11月6日 更新 其實 這個有乙個非常簡單的方法.非常簡單.listview selectionmode multiple 這個一xaml 就可以解決了.製作側邊點選效果也是和上乙個一樣的,等我找時間 弄一下 建議使用itemscontrol作為列表,使用listview的時候,listv...