2015-10-14 3 views
0

Я собираю список календарей из Календаря, он отлично работает. Наряду с именем календаря, я пытаюсь получить цвет календаря. Он работает, однако цвета разные (несколько ярче), чем фактические цвета, отображаемые в приложении Календаря Google. enter image description hereЦвет календаря для Android отличается от фактических значений

Я попытался с помощью различных методов преобразования возвращаемого цвета на значение гекс/RGB, но независимо от способа результат тот же:

int mColorCode = (0xff000000 + Integer.parseInt(colorStr)); 
String color="#"+Integer.toHexString(mColorCode); 
int argb = Integer.parseInt(str); 
String B = Integer.toString((mColorCode)&0xFF); 
String G = Integer.toString((mColorCode>>8)&0xFF); 
String R = Integer.toString((mColorCode>>16)&0xFF); 
String A = Integer.toString((mColorCode>>24)&0xFF); 
String rgbaString = "rgba("+R+","+G+","+B+","+A+")"; 

Как показано на рисунке выше разница в следующим образом:

Фактический цвет: # 7885cb Возвращается цвет: # 9a9cff

Фактический цвет: # 7cb242 Возвращается цвет: # 7bd148

Вышеуказанные цвета выглядят очень похожими, но для других цветов он становится хуже. Я думал, что, возможно, применяется какой-то фильтр, но я не смог найти какой-либо постоянной разницы между цветами, чтобы отменить его.

+2

Проверьте APK на другое устройство, я думаю, что цвет будет один вы ищете, как и когда-то цвет ч в соответствии с разрешениями экрана устройства. –

+0

Спасибо за ответ, это не помогло. Хотя я обнаружил, что приложение «Календарь» на старых устройствах отображает те же самые светлые цвета, которые я получаю. По-видимому, новое приложение «Календарь» применяет какую-то фильтрацию цветов. – jurer

+1

Я обнаружил, что цвет действительно меняется на новые версии для Android здесь: https://android.googlesource.com/platform/packages/apps/Calendar.git/+/android-5.1.0_r3/src/com/android /calendar/agenda/AgendaAdapter.java#181 Я применяю тот же фильтр к своим цветам, и для некоторых календарей результаты близки (хотя и не одинаковы), к сожалению, календари из «More» categeory в приложении «Календарь» полностью разные цвета. Также изменение цвета таких календарей в приложении Calednar не приводит к изменению моего цвета - похоже, что они определены внутри приложения Calenar. – jurer

ответ

0

Приложение Google calendar выполняет преобразование цветов. Он использует жесткую карту для поиска соответствия цветов. Если цвет не найден на карте, он применяет ручную трансформацию.

Это упрощенная (но функциональный) версия кода:

public final class CalendarUtils { 

private static final Map<Integer, Integer> sUpdatedColors; 

static { 
    Map hashMap = new HashMap(); 
    sUpdatedColors = hashMap; 
    hashMap.put(-509406, -2818048); 
    sUpdatedColors.put(-370884, -765666); 
    sUpdatedColors.put(-35529, -1086464); 
    sUpdatedColors.put(-21178, -1010944); 
    sUpdatedColors.put(-339611, -606426); 
    sUpdatedColors.put(-267901, -1784767); 
    sUpdatedColors.put(-4989844, -4142541); 
    sUpdatedColors.put(-8662712, -8604862); 
    sUpdatedColors.put(-15292571, -16023485); 
    sUpdatedColors.put(-12396910, -16738680); 
    sUpdatedColors.put(-7151168, -13388167); 
    sUpdatedColors.put(-6299161, -16540699); 
    sUpdatedColors.put(-6306073, -12417548); 
    sUpdatedColors.put(-11958553, -12627531); 
    sUpdatedColors.put(-6644481, -8812853); 
    sUpdatedColors.put(-4613377, -5005861); 
    sUpdatedColors.put(-5997854, -6395473); 
    sUpdatedColors.put(-3312410, -7461718); 
    sUpdatedColors.put(-3365204, -5434281); 
    sUpdatedColors.put(-618062, -2614432); 
    sUpdatedColors.put(-3118236, -1672077); 
    sUpdatedColors.put(-5475746, -8825528); 
    sUpdatedColors.put(-4013374, -10395295); 
    sUpdatedColors.put(-3490369, -5792882); 
    sUpdatedColors.put(-2350809, -2818048); 
    sUpdatedColors.put(-18312, -765666); 
    sUpdatedColors.put(-272549, -606426); 
    sUpdatedColors.put(-11421879, -16023485); 
    sUpdatedColors.put(-8722497, -13388167); 
    sUpdatedColors.put(-12134693, -16540699); 
    sUpdatedColors.put(-11238163, -12627531); 
    sUpdatedColors.put(-5980676, -8812853); 
    sUpdatedColors.put(-2380289, -7461718); 
    sUpdatedColors.put(-30596, -1672077); 
    sUpdatedColors.put(-1973791, -10395295); 
    sUpdatedColors.put(-2883584, -2818048); 
    sUpdatedColors.put(-831459, -765666); 
    sUpdatedColors.put(-1152256, -1086464); 
    sUpdatedColors.put(-1076736, -1010944); 
    sUpdatedColors.put(-672219, -606426); 
    sUpdatedColors.put(-1914036, -1784767); 
    sUpdatedColors.put(-4208334, -4142541); 
    sUpdatedColors.put(-8670655, -8604862); 
    sUpdatedColors.put(-16089278, -16023485); 
    sUpdatedColors.put(-16738937, -16738680); 
    sUpdatedColors.put(-16606492, -16540699); 
    sUpdatedColors.put(-12483341, -12417548); 
    sUpdatedColors.put(-12624727, -12627531); 
    sUpdatedColors.put(-8878646, -8812853); 
    sUpdatedColors.put(-5071654, -5005861); 
    sUpdatedColors.put(-7527511, -7461718); 
    sUpdatedColors.put(-5500074, -5434281); 
    sUpdatedColors.put(-2680225, -2614432); 
    sUpdatedColors.put(-1737870, -1672077); 
    sUpdatedColors.put(-8891321, -8825528); 
    sUpdatedColors.put(-10263709, -10395295); 
} 

public static int getDisplayColor(int color) { 
    if (sUpdatedColors.containsKey(color)) { 
     return (sUpdatedColors.get(color)); 
    } 
    if (sUpdatedColors.containsValue(color)) { 
     return color; 
    } 
    float[] fArr = new float[3]; 
    Color.colorToHSV(color, fArr); 
    if (fArr[2] > 0.79f) { 
     fArr[1] = Math.min(fArr[1] * 1.3f, 1.0f); 
     fArr[2] = fArr[2] * 0.8f; 
    } 
    return Color.HSVToColor(Color.alpha(color), fArr); 
} 

} 

Для получения преобразованного цвета, вы можете вызвать метод getDisplayColor (цвет), используя цвет, возвращаемый Calendar Provider (как Календарь Поставщик возвращает строку, нам нужно разобрать его на целое число ранее):

int eventColor = Integer.parseInt(colorStringFromCalendarProvider); 
int transformedColor = CalendarUtils.getDisplayColor(eventColor); 
0

Я хотел, чтобы это было комментариев, но я не знаю, как я могу отправить изображение в качестве комментария.

Вместо преобразования, можно добавить цвета жестко закодированные:

  • Томатные: 213, 0, 0
  • мандарин: 244, 81, 30
  • банан: 246, 191, 38
  • Базилик: 11, 128, 67
  • Шалфей: 251, 182, 121
  • Павлин: 3, 155, 129
  • голубики: 63, 81, 181
  • лаванды: 121, 134, 203
  • винограда: 142, 36, 170
  • Фламинго: 230, 124, 115
  • Графит: 97, 97, 97
  • по умолчанию Синий: 66, 133, 244

Google Calendar Colors in Android and in the Brower

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