指南針主要是通過方向傳感器來獲取方位的,使用傳感器呢,我們主要用到SensorManager類和Sensor類,通過getSystemService(Context.SENSOR_SERVICE)來初始化SensorManager對(duì)象,通過getDefaultSensor(Sensor.TYPE_ORIENTATION)來初始化Sensor對(duì)象。在下邊我們需要對(duì)傳感器進(jìn)行注冊,注冊方法registerListener(SensorEventListener listener, Sensor sensor,int samplingPeriodUs)的第一個(gè)參數(shù)我們需要實(shí)現(xiàn)這個(gè)接口并復(fù)寫相應(yīng)的方法,在方法onSensorChanged(SensorEvent event)中我們可以通過event.values[0]來獲取方位,這個(gè)數(shù)值的方位是(正北:0/360 ? 正東:90 ? 正南:180 ? 正西:270)我們獲取的是0到360的數(shù)值,但是實(shí)際上這些數(shù)值對(duì)應(yīng)的方位和現(xiàn)實(shí)中指南針的方位是對(duì)稱的,也就是關(guān)于Z軸對(duì)稱。因此我們經(jīng)常采用-event.values[0]。然后整個(gè)輪盤轉(zhuǎn)動(dòng)我這里采用的是一個(gè)自定義的旋轉(zhuǎn)動(dòng)畫來做的,接下來就直接上代碼了。
源代碼:(碼云:https://gitee.com/zhanma/codes/qw28ndj0akcpvf65hl1rg41)
MainActivity:




DefinedRotateAnimation (自定義旋轉(zhuǎn)動(dòng)畫):


MainActivity中44行提到一個(gè)bringToFront(),這個(gè)方法用來把控件調(diào)到前景,因?yàn)槲以谥改厢樦性O(shè)置了一個(gè)(TextView)指標(biāo),方便看出來當(dāng)前的轉(zhuǎn)到正中央的數(shù)值是多少。然后TextView控件和ImageView正好后者把前者覆蓋了,因此調(diào)用此方法把它調(diào)到上一層。自定義動(dòng)畫這塊用到initialize方法,用來初始化動(dòng)畫,applyTransformation方法用來實(shí)現(xiàn)動(dòng)畫變形(也就是實(shí)現(xiàn)動(dòng)畫的效果)
運(yùn)行截圖:


由于模擬器不方便測試這方向傳感器,所以我就使用真機(jī)調(diào)試,上面的運(yùn)行截圖都是從真機(jī)上截圖下來的。
以上是關(guān)于Android指南針的制作。