由于每个传感器对于相同的光照水平都有不同的值,所以我所做的是记录minimum
和maximum
将在应用程序生命周期内捕获的值,并将这些值存储为 aMin
和Max
,在使用应用程序几天后,所有设备都将具有我可以信赖的几乎相同的价值。作为初始状态,我认为最小值为1000
,最大值为0
。(我将它存储在 SharedPreferences 中)。Lux
然后我将通过考虑传感器的当前值来更新这些值。然后我会计算percentage
照明的。这是我写的代码:
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); //0 as init.
float currentMin = LightMetadata.getMinValue(context); //1000 as init.
if (luxValue > currentMax)
LightMetadata.setMaxValue(context, luxValue);
if (luxValue < currentMin)
LightMetadata.setMinValue(context, luxValue);
}
我通过将值从 min -> max 缩放到 0 -> 100 来计算百分比,这是函数:
/**
* @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;
}