2016-07-22 4 views
2

Мне нужно отправить цветовой код на сервер backend (пересылаемый клиенту iOS), но ContextCompact.getColor(context, colorResourceId); возвращает отрицательное значение, которое неузнаваем другими клиентами (iOS).Неисправность Android getColor

Это значение HEX ресурс:

<color name="green">#1FAB06</color> 

Этот код ниже дает мне следующее отрицательное целое значение: -14701818

int color = ContextCompat.getColor(context, mResourceColor); 

Это отрицательное значение, преобразованное в гекс:

1FAB06 

Если я преобразую это шестнадцатеричное значение в десятичное число, я получаю: 2075398

public int getColorDecimal(Context context) { 
    int color = ContextCompat.getColor(context, mResourceColor); 
    String hexColor = String.format("%06X", (0xFFFFFF & color)); 
    color = Integer.parseInt(hexColor, 16); 

    return color; 
} 

Проблема возникает, если я применил это положительное десятичное число к представлению. Android не распознает это значение. Текст редактирования остается белым.

mETName.setTextColor(getColorDecimal(context)); 

Клиент и веб-служба должны иметь такое же значение (каким-то образом) из-за синхронизации данных.

+0

Почему бы вам не преобразовать значения hex в значения rgb? – Pztar

ответ

5

Согласно DOCS этот метод не возвращает беззнаковое десятичное Int ... но шестнадцатеричное значение:

INT GetColor (контекст Context, внутр идентификатор)
Возвращает одно значение цвета в виде 0xAARRGGBB ,

Полученный номер в формате Alpha/Red/Green/Blue.

Поскольку ваш цвет является полным непрозрачным, getColor() автоматически возвращает FF в качестве альфа для вашего цвета. Так, в самом деле, вы цвет: FF1FAB06

Они все же

Все номера являются представлением одного и того же двоичного числа.

FF1FAB06 является шестнадцатеричным представлением следующего двоичного числа:

ALPHA  RED  GREEN  BLUE 
--------- --------- --------- --------- 
1111 1111 0001 1111 1010 1011 0000 0110 
    F F 1 F A B 0 1 

-14701818 является десятичное представление следующего двоичного числа:

ALPHA  RED  GREEN  BLUE 
--------- --------- --------- --------- 
1111 1111 0001 1111 1010 1011 0000 0110 
    F F 1 F A B 0 1 

Обратите внимание, что 32-й значащий бит равен 1. Таким образом, это число должно считаться отрицательным значением в подписанной системе/переменной.

Вот почему вы получите отрицательное число от getColor()

2075398, однако, следующее двоичное число:

ALPHA  RED  GREEN  BLUE 
--------- --------- --------- --------- 
0000 0000 0001 1111 1010 1011 0000 0110 
    0 0 1 F A B 0 1 

Таким образом, первый байт 00000000. Так, Альфа 00 и другими словами, 2075398 является полный прозрачный цвет

ANDROID

В случае Android, setTextColor() и getColor() ожидают шестнадцатеричные значения в формате 0xAARRGGBB .. Таким образом, вы должны держать что при получении/настройке цвета ...

Они также ожидают атрибут альфа (и не только красный/зеленый/синий). Так, полностью непрозрачный цвет, у вас есть 0xFF******

шестнадцатеричное значение, которое начинается с FF фактически является отрицательным десятичным значением для подписанных ИНТ представлений ...

На самом деле, все это просто представление а двоичный номер в памяти

Таким образом, в Android, если вы хотите установить цвет, вы должны сохранить отрицательное значение с -14701818, это десятичное представление шестнадцатеричного FF1FAB06 (при использовании подписанного int, который имеет место).

Если по какой-либо причине вам необходимо отправить десятичное положительное значение на сервер, используйте это положительное значение только для своего сервера и не разделяйте цвет Android. В противном случае вы должны постоянно конвертировать его в нужную систему (Android/iOS) каждый раз, когда хотите их использовать.

IOS

Я не знаю, как IOS ручка цвет .. Но, вероятно, вы должны тайным значение в формат, который может работать с IOS.

Смежные вопросы