2015-10-14 61 views
0

我從日曆提供程序獲取日曆列表,它工作得很好。隨着日曆名稱,我試圖檢索日曆的顏色。它可以工作,但是顏色與Google日曆應用中顯示的實際顏色不同(比較亮)。 enter image description here安卓日曆的顏色與實際值不同

我嘗試使用所返回的顏色轉換爲十六進制/ 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 我對我的顏色應用了相同的過濾器,對於某些日曆,結果很接近(儘管不盡相同),不幸的是,日曆應用中「更多」類別的日曆已完全不同的顏色。此外,在Calednar應用程序中更改此類日曆的顏色也不會導致我的顏色發生變化 - 看起來像是在Calenar應用程序中內部定義的。 – jurer

回答

0

Google日曆應用程序對顏色進行了轉換。它使用硬編碼的地圖來搜索顏色對應關係。如果在地圖上未找到顏色,則會應用手動轉換。

這是代碼的簡化(但功能)版本:

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(顏色)的方法(作爲日曆提供商返回一個字符串,我們需要之前將其解析爲整數):

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