Android'de bir renk tamsayı hex dizesine nasıl dönüştürülür?


197

Bir oluşturulan bir tamsayı var android.graphics.Color

Tamsayı -16776961 değerine sahiptir

Bu değeri #RRGGBB biçimindeki onaltılık bir dizeye nasıl dönüştürebilirim?

Basitçe söylemek gerekirse: -16776961'den # 0000FF çıktısını almak istiyorum

Not: Çıktının bir alfa içermesini istemiyorum ve bu örneği de herhangi bir başarı olmadan denedim


Onaltılık rengi ne ayarlamaya çalışıyorsunuz? Bence burada farklı bir cevap var
Blundell

@Blundell Rengi harici bir uygulamaya aktarıyorum. Rengin bu biçimde olması
gerekiyor #RRGGBB

Peki developer.android.com/reference/android/content/res/… ile ilgili sorun nedir? URL'yi yapıştırmanız veya getColor (int) için kaydırmanız gerekecek
Blundell

Ham tam sayıları alıyorum. Değerler bir kaynak ow widget'ından değildir
Bosah Chude

Yanıtlar:


472

Maske yalnızca RRGGBB almanızı sağlar ve% 06X size sıfır dolgulu hex (her zaman 6 karakter uzunluğunda) verir:

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));

3
Bu mükemmel çalıştı, teşekkürler! Integer.toHexString () üzerinde alt dize kullanmaya çalışmaktan daha kolay ve daha doğru.
Tom

7
Ben sadece tam olarak ne istediğini yapan Color.parseColor (String hex) yöntemi olduğunu fark ettim.
Marcel Bro

4
int colorInt = 0xff000000 | Integer.parseInt (hexString, 16);
Josh

5
Renginiz alfa kullanıyorsa bu cevabı kullanmayın. Onu kaybedeceksin.
Simon

5
@Simon, bu alfa hazır hale getirmek için sadece maskeyi çıkarın ve 6 ila 8 değiştirin. OP'nin alfadan vazgeçmesini istediğini unutmayın.
TWiStErRob

54

7
Bu cevap rengin
alfalarını koruyor

3
Alfadan kurtulmak istiyorsanız, bunun için biraz maske oluşturun: Integer.toHexString (value & 0x00FFFFFF)
ming_codes

3
Java int türü 4 bayt uzunluğundadır. Android.graphics.Color'un belgelerine göre, en yeni bayt alfa kanalı. Biraz akıllıca VE 0x00FFFFFF değeri ile işlem kullanarak, en sol bayt (alfa kanalı) 0'a temizler. Integer.toHexString ile kullanıldığında, 3 baytın geri kalanını String içinde bırakacaktır. Önemli olmayan tüm rakamlar çağrıdan çıkarılır, bu nedenle önde gelen sıfırları istiyorsanız, bunu kendinize eklemeniz gerekebilir.
ming_codes

1
Çalışmaz 0x000000FFveya 0xFF0000FFalfa kaldırırsanız.
TWiStErRob

26

Ben cevap bulduk inanıyorum, Bu kod bir hex dizeye tamsayı dönüştürür bir alfa kaldırır.

Integer intColor = -16895234;
String hexColor = "#" + Integer.toHexString(intColor).substring(2);

Not emin alfa çıkarmadan şey etkilemeyeceği konusunda ise yalnızca bu kodu kullanın.


1
Eğer 0x00FFFFFFbu yolla gönderirseniz çökecektir Color.parseColor.
TWiStErRob

9

İşte yaptığım şey

 int color=//your color
 Integer.toHexString(color).toUpperCase();//upercase with alpha
 Integer.toHexString(color).toUpperCase().substring(2);// uppercase without alpha

Teşekkürler cevaplar çocuklar şey yaptı


İlk değişken 0x00FFFFFF-> "FFFFFF" (alfa yok) için çalışmaz . İkinci varyant 0x00000FFF-> "F" (eksik bitler) için çalışmaz .
TWiStErRob

@TWiStErRob, alfa kanallı renkler için güvenilir şekilde çalışan bir çözüm mü buldunuz?
Saket

2
@Saket En yüksek yanıt veren varyantı:String.format("#%08X", intColor)
TWiStErRob

@TWiStErRob Ah, yorumunuzu en iyi yanıtın altında gördünüz. Teşekkürler!
Saket

5

ARGB renginin onaltılık dizeye tamsayı değeri:

String hex = Integer.toHexString(color); // example for green color FF00FF00

ARGB renginin tamsayı değerine onaltılık dize:

int color = (Integer.parseInt( hex.substring( 0,2 ), 16) << 24) + Integer.parseInt( hex.substring( 2 ), 16);

4

Integer.toHexString yöntemiyle , Color.parseColor kullanırken bazı renkler için Bilinmeyen bir renk özel durumunuz olabilir.

Ve bu yöntem String.format ("#% 06X", (0xFFFFFF & intColor)) ile alfa değerini kaybedersiniz.

Bu yüzden bu yöntemi tavsiye ederim:

public static String ColorToHex(int color) {
        int alpha = android.graphics.Color.alpha(color);
        int blue = android.graphics.Color.blue(color);
        int green = android.graphics.Color.green(color);
        int red = android.graphics.Color.red(color);

        String alphaHex = To00Hex(alpha);
        String blueHex = To00Hex(blue);
        String greenHex = To00Hex(green);
        String redHex = To00Hex(red);

        // hexBinary value: aabbggrr
        StringBuilder str = new StringBuilder("#");
        str.append(alphaHex);
        str.append(blueHex);
        str.append(greenHex);
        str.append(redHex );

        return str.toString();
    }

    private static String To00Hex(int value) {
        String hex = "00".concat(Integer.toHexString(value));
        return hex.substring(hex.length()-2, hex.length());
    }

0
String int2string = Integer.toHexString(INTEGERColor); //to ARGB
String HtmlColor = "#"+ int2string.substring(int2string.length() - 6, int2string.length()); // a stupid way to append your color

0

Eğer kullanırsanız Integer.toHexStringsize sonuna kadar olacak cevapsız sıfırlarla sizin gibi renkleri dönüştürdüğünüzde 0xFF000123. İşte ne android belirli sınıflar ne de java gerektirmeyen kotlin tabanlı çözüm. Böylece çoklu platform projesinde de kullanabilirsiniz:

    fun Int.toRgbString(): String =
        "#${red.toStringComponent()}${green.toStringComponent()}${blue.toStringComponent()}".toUpperCase()

    fun Int.toArgbString(): String =
        "#${alpha.toStringComponent()}${red.toStringComponent()}${green.toStringComponent()}${blue.toStringComponent()}".toUpperCase()

    private fun Int.toStringComponent(): String =
        this.toString(16).let { if (it.length == 1) "0${it}" else it }

    inline val Int.alpha: Int
        get() = (this shr 24) and 0xFF

    inline val Int.red: Int
        get() = (this shr 16) and 0xFF

    inline val Int.green: Int
        get() = (this shr 8) and 0xFF

    inline val Int.blue: Int
        get() = this and 0xFF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.