實戰第13篇:Sensor距離感測器實現小豬睡覺趣味App

語言: CN / TW / HK

theme: Chinese-red

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第13天,點選檢視活動詳情


一、展示效果

本次實戰專案,利用Android中的距離感測器,開發一個小豬睡覺的趣味應用,靠近小豬,它就睡覺;你一離開,它就作妖。可用於哄娃,效果如下:

影片21.gif

二、原始碼放送

xml佈局中只有一個居中的ImageView圖片,用於顯示小豬圖片,此處就不再贅述了。

重點把Activity裡的程式碼,給大家展示一下。

```java public class MainActivity extends Activity {

private ImageView imageView;
private SensorManager manager;
private SensorListener listener = new SensorListener();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = findViewById(R.id.imageView);
    // 獲取管理器
    manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}

@Override
protected void onResume() {
    // 獲取距離感測器
    Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    // 註冊監聽
    manager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
    super.onResume();
}

private final class SensorListener implements SensorEventListener {

    @Override
    public void onSensorChanged(SensorEvent event) {

        if (event.values[0] == 0.0) {
            // 0 表示距離較近
            imageView.setImageResource(R.mipmap.sleep);
        } else {
            // 距離不近
            imageView.setImageResource(R.mipmap.active);
        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
}

@Override
protected void onPause() {
    manager.unregisterListener(listener);
    super.onPause();
}

} ```

能看明白的,抱好鍵盤,可以走了。看不明白的,聽我下面進行解讀。

三、原理解讀

2.1 感測器 Sensor

距離感測器是一個小硬體,廣泛應用於智慧手機,一般位於聽筒附近,當接通電話時,手機距離耳朵較近,此時容易出現誤操作現象(如面部易結束通話電話,臉大者的苦惱),因此就需要對距離進行關注,避免誤操作的發生。

智慧手機上使用的距離感測器大多是紅外距離感測器。

image.png

當發射管發出的紅外線被接收管接收到時,表明距離較近,而當接收管接收不到發射管發射的紅外線時,表明距離較遠。Android中距離感測器會返回距離的資料,當感測器被遮擋距離較近時數值為0。

2.2 呼叫方法

我們說過,感測器它是一個硬體。正常情況下,程式碼想要呼叫硬體,這是很困難的,需要各種橋樑和媒介。

但是,我們是做應用,不是搞研發,Android SDK早就為我們準備好了相應的API

Android中關於感測器的類叫做Sensor。我們要實現感測器資料的獲取,需要兩步:

第一步:從SensorManager得到Sensor感測器。

java SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor oSensor = manager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 先獲取感測器的管理器,你看這多拗口,感測器的管理器。Android SDK很人性化,自己默默地把所有感測器都整合明白了,只需要一個管理類,你想要什麼就跟它說,上面getDefaultSensor的引數Sensor.TYPE_PROXIMITY指的就是,我們要感測器型別為距離感測器。當然還有很多,比如明天我們講方向感測器。

第二步:給Sensor感測器註冊回撥。 ```java manager.registerListener(new SensorListener(), oSensor, SensorManager.SENSOR_DELAY_NORMAL);

class SensorListener implements SensorEventListener {

@Override
public void onSensorChanged(SensorEvent event) {
    // event.values[0]  距離,數值為0表示距離較近
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

} `` - 第一個引數,表示我們的感測器有資料變化時,應該通知誰(這裡是SensorListener,繼承了SensorEventListener,實現了onSensorChanged方法)進行處理。 - 第二個引數,是給哪種感測器設定,我們上面構建的是一個TYPE_PROXIMITY型別,也就是距離感測器。 - 其中第三個引數SensorManager.SENSOR_DELAY_NORMAL是變化的靈敏度,設定你對感測器的要求,是需要極其敏銳,還是沒有太高要求,此處我們取普通NORMAL`就行。

重點我們看一下SensorEventListener裡面的方法,一個叫onSensorChanged,表示感測器資料變化。另一個叫onAccuracyChanged,表示感測器精度變化。

我們只要資料變化就行。我們說過Android SDK給感測器搞了個大整合,所以此處的SensorEvent event是一個通用的引數,對於距離感測器來說,event.values[0]就是距離的數值。

所以,距離近時,就給圖片設定小豬睡覺的圖片,距離遠時就給小豬設定作妖的圖片。 java if (event.values[0] == 0.0) { // 0 表示距離較近 imageView.setImageResource(R.mipmap.sleep); } else { imageView.setImageResource(R.mipmap.active); } 唉,會技術就是這麼的高雅和樸實!

影片21.gif

最後

我是TF男孩,關注我的掘金專欄《Java轉Android》。日讀1000字,30天可入門安卓開發。

本文掘金社群獨家釋出,轉載請註明出處。