由于每个传感器对于相同的光强度有不同的值,因此我记录了应用程序生命周期中将捕获的
最小
和
最大
值,并将这些值存储为
Min
和
Max
。使用应用程序几天后,所有设备的值几乎相同,我可以依赖它们。
作为初始状态,我认为最小值是
1000
,最大值是
0
。(我将其存储在SharedPreferences中)。
然后,我将通过考虑传感器的当前
Lux
值来更新这些值。
然后我会计算
百分比
的照明程度。
这是我编写的代码:
float luxValue = o.getAsFloat("double_light_lux");
//here I update the value in sharedPreferences
updateMaxAndMinValue(context, luxValue);
float percentageValue = scale(LightMetadata.getMinValue(context),
LightMetadata.getMaxValue(context),
0,
100,
luxValue);
更新功能:
public static void updateMaxAndMinValue(Context context, float luxValue) {
float currentMax = LightMetadata.getMaxValue(context);
float currentMin = LightMetadata.getMinValue(context);
if (luxValue > currentMax)
LightMetadata.setMaxValue(context, luxValue);
if (luxValue < currentMin)
LightMetadata.setMinValue(context, luxValue);
}
我通过将值从最小值到最大值进行缩放,计算出百分比,具体函数如下:
/**
* @param min old min value
* @param max old max value
* @param a new min value
* @param b new max value
* @param value the value that want to scale
* @return new scaled value
*/
public static float scale(float min, float max, float a, float b, float value) {
// (b-a)(x - min)
//f(x) = -------------- + a
// max - min
float scaled;
float numerator = (b - a) * (value - min);
float denominator = max - min;
scaled = (numerator / denominator) + a;
return scaled;
}