Есть много способов, по которым люди рекомендуют использовать SharedPreferences. Я сделал демо-проект здесь . Ключевой момент в выборке - использовать ApplicationContext & amp; единый объект sharedpreferences. Это демонстрирует, как использовать SharedPreferences со следующими функциями: -
Пример использования, как показано ниже: -
MyAppPreference.getInstance().setSampleStringKey("some_value");
String value= MyAppPreference.getInstance().getSampleStringKey();
Get исходный код здесь & amp; Подробные API можно найти здесь здесь на developer.android.com
Вам нужно сначала найти диапазон этих значений, чтобы получить минимальное и максимальное значения. Затем вам нужно создать цветовую шкалу, как в строке ниже этого изображения. Вы можете поэкспериментировать с различными функциями, чтобы отобразить целое число в RGB. Вам нужно 3 функции R (X), G (X), B (X). Глядя на изображение ниже, оно выглядит как пики B (X) в середине, пики R (X) в конце, а зеленый - где-то еще. Если вы уверены, что никогда не получите два (RGB) для некоторого значения X, то вы получите свое преобразование.
(источник: globalwarmingart.com )
РЕДАКТИРОВАТЬ Подумайте об этом, вы можете взять образец круга вокруг пространства YUV. alt text http://www.biocrawler.com/w/images/e/ec/Yuv.png
Или даже просто скачайте цветную полосу с высоким разрешением и сэмплируйте ее.
РЕДАКТИРОВАТЬ 2: Я только что столкнулся с генерацией цветных полос и вспомнил код цветовой полосы MATLAB / Octave. Я нанес их на карту и получил следующее изображение.
Этот ответ, вероятно, немного опоздал на вечеринку. Я отображаю некоторые данные об окружающей среде, и мне нужно покрасить результирующие столбцы от зеленого до красного относительно максимума и минимума набора данных (или какие значения всегда передаются как максимальные и минимальные значения функции. В любом случае, приведенное ниже выполнение этого Я думаю, что можно довольно легко сменить синий на красный.
// scale colour temp relatively
function getColourTemp(maxVal, minVal, actual) {
var midVal = (maxVal - minVal)/2;
var intR;
var intG;
var intB = Math.round(0);
if (actual >= midVal){
intR = 255;
intG = Math.round(255 * ((maxVal - actual) / (maxVal - midVal)));
}
else{
intG = 255;
intR = Math.round(255 * ((actual - minVal) / (midVal - minVal)));
}
return to_rgb(intR, intG, intB);
}
Не зная диапазона значений, вы не сможете придумать осмысленную функцию, отображающую произвольный диапазон целых положительных чисел на диапазон цветов типа тепловой карты.
Я думаю, что вам придется просмотреть ваши данные хотя бы один раз, чтобы получить минимальное/максимальное значение или узнать их заранее. Получив их, вы можете нормализовать их соответствующим образом и использовать любое количество цветовых схем. Простейшим решением будет указать что-то вроде "hue" и преобразовать из HSV в RGB.
Простой алгоритм
// given a max and min value
float red,green,blue;
float range=max-min;
float mid=(max+min)/2.0;
//foreach value
red = (value[ii]-mid)/range;
if (red>0.0) {
//above mid = red-green
blue=0.0;
green = 1.0-red;
} else {
// lower half green-blue
blue=-red;
green = 1.0-blue;
red=0.0;
}
}
Более сложный:
Если ваш диапазон составляет несколько миллионов, но большинство из них около 0, вы хотите масштабировать его так, чтобы «красный» в приведенном выше примере был журналом расстояние от середины. Код немного сложнее, если значения равны +/-
// assume equally distributed around 0 so max is the largest (or most negative number)
float range = log(fabs(max));
float mid=0.0
// foreach value
if (value[ii] > 0.0 ) {
// above mid = red-green
red = log(value[ii])/range;
blue=0.0;
green = 1.0 - red;
} else {
// below mid = green-blue
blue=-log(value[ii])/range;
green = 1.0 - blue;
red = 0.0;
}
. Примечание - я не тестировал этот код, просто вертелся идеями!
человек, вы, вероятно, могли бы использовать цветовое пространство YUV и только для демонстрационных целей преобразовать его в RGB.
Вы хотите преобразовать значения данных в частоту света:
частоты видимого света варьируются от 350 нм (фиолетовый) до 650 нм (красный):
(источник: gamonline.com )
Следующая функция преобразует числа в указанном вами диапазоне в диапазон видимый свет, затем получает rgb:
function DataPointToColor(Value, MinValue, MaxValue: Real): TColor;
var
r, g, b: Byte;
WaveLength: Real;
begin
WaveLength := GetWaveLengthFromDataPoint(Value, MinValue, MaxValue);
WavelengthToRGB(Wavelength, r, g, b);
Result := RGB(r, g, b);
end;
С помощью функции, которую я записал в верхней части моей головы:
function GetWaveLengthFromDataPoint(Value: Real; MinValues, MaxValues: Real): Real;
const
MinVisibleWaveLength = 350.0;
MaxVisibleWaveLength = 650.0;
begin
//Convert data value in the range of MinValues..MaxValues to the
//range 350..650
Result := (Value - MinValue) / (MaxValues-MinValues) *
(MaxVisibleWavelength - MinVisibleWavelength) +
MinVisibleWaveLength;
end;
И функцию , которую я нашел в Интернете , которая преобразует длину волны в RGB:
PROCEDURE WavelengthToRGB(CONST Wavelength: Nanometers;
VAR R,G,B: BYTE);
CONST
Gamma = 0.80;
IntensityMax = 255;
VAR
Blue : DOUBLE;
factor : DOUBLE;
Green : DOUBLE;
Red : DOUBLE;
FUNCTION Adjust(CONST Color, Factor: DOUBLE): INTEGER;
BEGIN
IF Color = 0.0
THEN RESULT := 0 // Don't want 0^x = 1 for x <> 0
ELSE RESULT := ROUND(IntensityMax * Power(Color * Factor, Gamma))
END {Adjust};
BEGIN
CASE TRUNC(Wavelength) OF
380..439:
BEGIN
Red := -(Wavelength - 440) / (440 - 380);
Green := 0.0;
Blue := 1.0
END;
440..489:
BEGIN
Red := 0.0;
Green := (Wavelength - 440) / (490 - 440);
Blue := 1.0
END;
490..509:
BEGIN
Red := 0.0;
Green := 1.0;
Blue := -(Wavelength - 510) / (510 - 490)
END;
510..579:
BEGIN
Red := (Wavelength - 510) / (580 - 510);
Green := 1.0;
Blue := 0.0
END;
580..644:
BEGIN
Red := 1.0;
Green := -(Wavelength - 645) / (645 - 580);
Blue := 0.0
END;
645..780:
BEGIN
Red := 1.0;
Green := 0.0;
Blue := 0.0
END;
ELSE
Red := 0.0;
Green := 0.0;
Blue := 0.0
END;
// Let the intensity fall off near the vision limits
CASE TRUNC(Wavelength) OF
380..419: factor := 0.3 + 0.7*(Wavelength - 380) / (420 - 380);
420..700: factor := 1.0;
701..780: factor := 0.3 + 0.7*(780 - Wavelength) / (780 - 700)
ELSE factor := 0.0
END;
R := Adjust(Red, Factor);
G := Adjust(Green, Factor);
B := Adjust(Blue, Factor)
END {WavelengthToRGB};
Пример использования:
Набор данных в диапазоне 10..65000000. И эта конкретная точка данных имеет значение 638,328:
color = DataPointToColor(638328, 10, 65000000);