有兩種建議方式可解譯和使用來自環境光線感測器的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;
}