2016-07-22 4 views
2

バックエンドサーバー(iOSクライアントに転送)にカラーコードを送信する必要がありますが、ContextCompact.getColor(context, colorResourceId);は他のクライアント(iOS)で認識できない負の値を返します。Android getColor inconsistency

これは、リソースHEX値である:

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

以下このコードは私の次の負の整数値を与える:-14701818

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

をヘクスに変換し、この負の値である:

1FAB06 

この16進数値を10進数に変換すると、私は次のようになります。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)); 

クライアントとWebサービスは、データ同期のために(何とか)同じ値を持つ必要があります。

+0

代わりに16進数をrgb値に変換するのはなぜですか? – Pztar

答えて

5

DOCSによれば、この方法は、符号なし10進整数を返しません...しかし、進値:フォーム0xAARRGGBBにおける単一のカラー値を返し

INT GETCOLOR(コンテキスト・コンテキスト、int型のID)

受信した数字は、アルファ/赤/緑/青のフォーマットです。

色が完全に不透明であるため、getColor()は自動的にFFをアルファとして返します。あなた色があるので、実際には、:FF1FAB06

彼らはすべて同じ

すべての数字が同じ進数の表現されています。

FF1FAB06は、2進数を、以下の16進表現である:

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

-14701818は、2進数を次の符号付き10進数表現である:第32最上位ビットがそう1であること

ALPHA  RED  GREEN  BLUE 
--------- --------- --------- --------- 
1111 1111 0001 1111 1010 1011 0000 0110 
    F F 1 F A B 0 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は形式0xAARRGGBB 16進数値を期待しているアンドロイド、setTextColor()getColor()の場合

アンドロイドフル透明色であります色を取得/設定するときに念頭に置いてください。

また、(赤色/緑色/青色だけでなく)Alpha属性も期待しています。だから、完全に不透明な色のために、あなたは... FFで始まる0xFF******

進値が実際に署名したint型の表現のための負の小数の値である実際に

を持って、すべてがちょうどの表現ですメモリ内のバイナリ数

この方法で、あなたは色を設定したい場合はAndroidの中で、あなたがするので、負の値を維持する必要がありますが-14701818(ケースで署名したint型を使用して)FF1FAB06の16進数の10進表現です。

何らかの理由で10進の正の値をサーバーに送信する必要がある場合は、その正の値をサーバーにのみ使用し、Androidの色を分けたままにします。それ以外の場合は、いつでも適切なシステム(Android/iOS)に変換しておく必要があります。

IOS

私はIOSハンドルの色は..しかし、おそらく、あなたはIOSが処理できる形式に値をひそかしなければならないかどうかはわかりません。

関連する問題