Как изменить значения RGB на основе некоторой переменной? ( Цвета с сопоставлением значений )

Я пытаюсь программно сопоставить значения с плавающей точкой от 1.0 до 5.0 с цветами RGB. Ниже программа работает нормально для меня, но она принимает значение с плавающей запятой и сравнивает с некоторым диапазоном и возвращает жестко закодированные значения RGB.

Вместо этого я хочу изменить значения RGB на основе значений с плавающей запятой. В моей логике я точно получаю один и тот же цвет от 1,1 до 1,9, но я хочу динамически изменять RGB на основе от 1,0 до 5,0.

Если бы я попытался переключить R, G, B, но не смог этого сделать.

btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String test = "1.8,-0.9,3,4.9,2.3";
            String[] sep = test.split(",");       //seperating data on ","

            et0.setText(sep[0]);
            float f0 = Float.parseFloat(sep[0]);   // changing string to float to compare in checkdata();
            et0.setBackgroundColor(Color.parseColor(checkdata(f0)));

            et1.setText(sep[1]);
            float f1 = Float.parseFloat(sep[1]);

            et1.setBackgroundColor(Color.parseColor(checkdata(f1)));

            et2.setText(sep[2]);
            float f2 = Float.parseFloat(sep[2]);
            et2.setBackgroundColor(Color.parseColor(checkdata(f2)));

            et3.setText(sep[3]);
            float f3 = Float.parseFloat(sep[3]);
            et3.setBackgroundColor(Color.parseColor(checkdata(f3)));

            et4.setText(sep[4]);
            float f4 = Float.parseFloat(sep[4]);
            et4.setBackgroundColor(Color.parseColor(checkdata(f4)));
        }
    });
}

public String checkdata(float f) {

     if (f<1) {

        return "#000000" ;
    }
    if ( f >=1 && f<2) {

        return "#febebb" ;
    }
    if (f >= 2 && f<3) {
        return "#fe8f8b" ;
    }
    if (f >=3 && f<4) {
        return "#fe5953" ;
    }
    if (f >=4 && f<5) {
        return "#ff0900" ;
    }
    else {
        return "#000000";
    }
}

Любая помощь?


person Garry S    schedule 19.08.2016    source источник


Ответы (2)


хочешь градиент? если да, https://stackoverflow.com/a/33466114/2061650 поможет вам

if ( f >=1 && f<2) {

        return "#febebb" ;
    }
    if (f >= 2 && f<3) {
        return "#fe8f8b" ;
    }

->

if ( f >=1.5 && f<2.5) {
   c1 = C.pc("#febebb");
   c2 = C.pc("#fe8f8b");
   return evaluator.evaluate( (f-1.5) /(2.5-1.5), c1, c2)

}

а также

et4.setBackgroundColor(Color.parseColor(checkdata(f4)));

->

et4.setBackgroundColor(checkdata(f4));
person sergii.gudym    schedule 19.08.2016
comment
Да, я ищу градиент. У меня есть 25 различных значений в edittext, и он должен представлять цвет фона на основе значений в edittxt. - person Garry S; 20.08.2016
comment
Я думаю, что (f-1,5)/(2,5-1,5) является двойным, но требуется float. И оценка возвращает объект, а не целое число. Но проверю еще раз. - person Garry S; 20.08.2016
comment
оценка возвращает целое число. android.googlesource.com/ платформа/фреймворки/база/+/мастер/ядро/ - person sergii.gudym; 20.08.2016
comment
Я ответил на свои вопросы, но спасибо! Оценщик - отличная функция! Следовательно, я не использовал его. - person Garry S; 24.08.2016

Для тех, кого интересовал этот вопрос!

Я использовал только синий цвет RGB(HEX) (с разделением строк) и преобразовал шестнадцатеричный код B в целое число. Затем я использовал формулу градиента. После этого значения с плавающей запятой я округлил до целого числа и преобразовал в шестнадцатеричное значение. Все это преобразование Hex -> Int -> Float -> Int -> Hex было выполнено только для Blue. Теперь я объединяю B с RG, и у меня есть обновленный RGB на основе значения переменной.

  public String checkdata(float f) {

        String Picked = ec1.getText().toString();
        Log.i("Color Picked(Hex)",Picked);
        
        String gradSelect = ec1.getText().toString().substring(5);     // picking B from #RRGGBB which is 5th element
        Log.i("Seperated Single(Hex)",gradSelect);
        int intGrad = Integer.parseInt(gradSelect,16);    //Converting Blue to Integer equivalent
        Log.i("Converted to Int", ""+intGrad );

        float float2Grad = f*255/5;    // Mapping Input f's ( 0 to 5 ) values to 0 to 255 color values
       // float float2Grad = (intGrad - f)/ (6-f);     //another formula, but range will not be full 0 to 255 integers of color
        Log.i("Float2Gradient", ""+float2Grad );

        int rounded_i = Math.round(float2Grad);                              //float to int
        Log.i("Rounded Gradient(Int)", ""+rounded_i);

        String updatedBlueHex = Integer.toHexString(rounded_i);              // padding by O for integer values < 15 (Hex 0 to F), so  that RRGGB can be avoided and RRGGBB
        if (updatedBlueHex.length() == 1) {
            updatedBlueHex = "0".concat(updatedBlueHex);                       // if its F then It will give 0F and hence RRGGBB formate maintained
                                }
        Log.i("Updated Single(Hex)",updatedBlueHex);



        String redGreen = Picked.substring(1,5);                                 // RRGG 
        Log.i("Untouched RG(Hex)", redGreen);

        String Returning = redGreen.concat(updatedBlueHex);                                // RRGG + Bb = RRGGBB
        Log.i("Returned String(Hex)",Returning);

        return "#"+Returning; 

    }

Это сработало для меня! Спасибо. Комментарий Если у вас есть вопросы

person Garry S    schedule 24.08.2016