共用方式為


使用光線感應器資料

有兩種建議的方式可解譯和使用來自環境光線感應器的 lux 資料。

  • 將轉換套用至資料,讓標準化光線等級可以直接比例使用至程式列為或互動。 例如,範例會根據正規化資料 (或與) 室內對應的標準化資料範圍,以直接比例變更程式中按鈕的大小。 此方法可提供最佳實作。
  • 處理 lux 資料的範圍,並將程式列為和反應對應到這些 lux 資料範圍的上限和較低閾值。 這是回應光源條件的簡單方式,可能不會產生最佳的使用者體驗。 不過,如果平滑轉換不可行,此方法會正常運作。

處理來自多個光線感應器的資料

若要產生目前光源條件最精確的近似值,您可以使用來自多個環境光線感應器的資料。 因為環境光線感應器可以部分或完全遮蔽在遮蔽感應器的陰影或物件,所以多個感應器相隔一些距離可以提供比單一感應器更好的目前光源條件近似值。

若要追蹤來自多個感應器的資料,您可以使用下列兩種技術:

  • 您可以保留每個環境光線感應器的最新資料值,以及每個讀數之感應器資料包表的時間戳記。 針對每個感應器讀取收到的最後 一個 ISensorDataReport 可以保留,而且可以提供這兩個值以供稍後參考。 藉由參考每個感應器資料包表的時間戳記,即可根據其年齡來管理資料。 例如,如果資料超過 2 秒,可以省略它。 根據較新的感應器資料值,可以使用最高的讀數,因為會假設對應的感應器不會遮蔽。
  • 您可以使用回報的最後一個環境光線感應器值。 此實作不是最佳作法,因為多個感應器的值不會彼此比較,以取得最精確的結果。 不建議使用此方法。

範例程式碼

下列範例程式碼示範 OnDataUpdated 事件的實作。 事件處理常式會呼叫名為 UpdateUI的協助程式函式,以根據 lux 值來變更使用者介面。 撰寫 UpdateUI 的實作會由您決定。

// Override of ISensorEvents::OnDataUpdated
// Part of an event sink implementation for ISensorEvents
STDMETHODIMP CALSEventSink::OnDataUpdated(
    ISensor* pSensor, 
    ISensorDataReport* pNewData)
{
    HRESULT hr = S_OK;
   
    if(pSensor == NULL ||
       pNewData == NULL)
    {
         return E_POINTER;
    }

    // Declare and initialize the PROPVARIANT
    PROPVARIANT lightLevel;
    PropVariantInit(&lightLevel);

    // Get the sensor reading from the ISensorDataReport object
    hr = pNewData->GetSensorValue(
        SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, 
        &lightLevel);

    if(SUCCEEDED(hr))
    {
        if(lightlevel.vt == VT_R4)
        {
            // Extract the float value from the PROPVARIANT object
            float luxValue = lightLevel.fltVal;

            // Normalize the light sensor data
            double lightNormalized = ::log10(luxValue) / 5.0;

            // Handle UI changes based on the normalized LUX data
            // which ranges from 0.0 - 1.0 for a lux range of 
            // 0 lux to 100,000 lux. 
            UpdateUI(lightNormalized);
        }
    }

    // Release the variant.     
    PropVariantClear(&lightLevel);

    return hr;
}