どもども〜
見習いプログラマーのnaoponです!
A君:秋ですか?
C君:秋ですね〜
A君:秋といえば?紅葉の秋?
C君:カラフルですね〜
『そうだ!Android Colorの明るさや透過を変えてみよう!』
調べてみると、AndroidのColorにはHSV色空間を取得する関数が用意されていました。
AndroidでのHSVの各要素の値範囲はこちら
色相:0〜360
彩度:0.0〜1.0
明度:0.0〜1.0
この辺りをいじれたら良さそうですね。
色とかあまり詳しくないので、少しだけお試しメモにしようと思います。
■やりたいこと
Color lighter
Color darker
Color brightness
Color mixer
実際に適当な色で試してみたんだけど、あれ?
1 2 3 4 5 6 7 |
int color = Color.parseColor("#2ecc71"); //color基準 int colorB = ColorUtil.setBrightness(color, 0.7); //明暗0.7 OK int colorA = ColorUtil.setAlpha(color, 0.5); //透過0.5 OK int colorD = ColorUtil.darker(color, 0.2, 1.0); //+黒0.2 ん〜〜まぁOK int colorL = ColorUtil.lighter(color, 0.2, 1.0); //+白0.2 ん〜〜まぁOK int color1 = ColorUtil.brighter(color, 0.5, 1.0); //color基準から明暗0.5 OK int color2 = ColorUtil.brighter(color, 1.5, 1.0); //color基準から明暗1.5 あれ? |
基準にしているColorの明暗が最大値(1.0)だったので、
それ以上明るくできないようですね。
以下、実際に作成してみたコードです。
時間があれば、明暗だけじゃなく、彩度の方もいじってみようかな?
それでは、みなさん ByeBye☆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
public class ColorUtil extends Color { /** * HSV色空間 * @param color * @return float[0]:色相、float[1]:彩度、float[2]:明度 */ static public float[] hsv(int color) { float[] hsv = new float[3]; Color.colorToHSV(color, hsv); return hsv; } /** * 指定色に明度をセットする * @param color * @param brightness (0.0〜1.0) * @return */ static public int setBrightness(int color, float brightness) { if (brightness < 0.f || 1.f < brightness) return color; float[] hsv = hsv(color); hsv[2] = brightness; return Color.HSVToColor(hsv); } /** * 指定色に透過をセットする * @param color * @param alpha (0.0〜1.0) * @return */ static public int setAlpha(int color, float alpha) { if (alpha < 0.f || 1.f < alpha) return color; float[] hsv = hsv(color); return Color.HSVToColor((int)(255*alpha), hsv); } /** * 指定色を基準に明暗を付ける * @param color * @param ratio (明暗率 0.0〜) * @param alpha (透過率 0.0〜1.0) * @return */ static public int brighter(int color, float ratio, float alpha) { if (ratio < 0.f) return color; if (alpha < 0.f || 1.f < alpha) return color; float[] hsv = hsv(color); hsv[2] *= ratio; if (1.f < hsv[2]) { hsv[2] = 1.f; } else if (hsv[2] < 0) { hsv[2] = 0.f; } return Color.HSVToColor((int)(255*alpha), hsv); } /** * 配合色 * @param baseColor * @param blendColor * @param amount (ベース割合 0.0〜1.0) * @return */ static public int mixer(int color, int blendColor, float amount) { if (amount < 0.f || 1.f < amount) return color; final byte ALPHA_CHANNEL = 24; final byte RED_CHANNEL = 16; final byte GREEN_CHANNEL = 8; final byte BLUE_CHANNEL = 0; final float inverseAmount = 1.0f - amount; int a = ((int)(((float)(color >> ALPHA_CHANNEL & 0xff )*amount) + ((float)(blendColor >> ALPHA_CHANNEL & 0xff )*inverseAmount))) & 0xff; int r = ((int)(((float)(color >> RED_CHANNEL & 0xff )*amount) + ((float)(blendColor >> RED_CHANNEL & 0xff )*inverseAmount))) & 0xff; int g = ((int)(((float)(color >> GREEN_CHANNEL & 0xff )*amount) + ((float)(blendColor >> GREEN_CHANNEL & 0xff )*inverseAmount))) & 0xff; int b = ((int)(((float)(color & 0xff )*amount) + ((float)(blendColor & 0xff )*inverseAmount))) & 0xff; return a << ALPHA_CHANNEL | r << RED_CHANNEL | g << GREEN_CHANNEL | b << BLUE_CHANNEL; } /** * 指定色に暗(黒)を混合 * @param color * @param ratio (黒の割合 0.0〜1.0) * @param alpha (透過率 0.0〜1.0) * @return */ static public int darker(int color, float ratio, float alpha) { int mix = mixer(color, Color.BLACK, (1.f-ratio)); return setAlpha(mix, alpha); } /** * 指定色に明(白)を混合 * @param color * @param ratio (白の割合 0.0〜1.0) * @param alpha (透過率 0.0〜1.0) * @return */ static public int lighter(int color, float ratio, float alpha) { int mix = mixer(color, Color.WHITE, (1.f-ratio)); return setAlpha(mix, alpha); } } |