我在游戏中有这个部分,其中圆圈绘制不同的颜色,我希望玩家能够在Toast
上显示的每次点击时看到颜色名称。我怎样才能实现这一点?我的代码如下。任何帮助将不胜感激?我想以String Form Eg显示它们。如果RGB为红色,则显示红色通知字符串。
static int x,y,r=255,g=255,b=255;
final static int radius=180;
Paint paint;
public Circle(Context context)
{
super(context);
paint=new Paint();
paint.setAntiAlias(true);
paint.setARGB(255, r, g, b);
setFocusable(true);
this.setOnTouchListener(this);
}
public void onDraw(Canvas canvas)
{
paint.setARGB(255, r, g, b);
canvas.drawCircle(x,y,radius,paint);
}
答案 0 :(得分:2)
如果您希望将颜色名称与RGB值严格匹配,则需要将随机RGB与您选择的已知颜色相匹配。例如,您可以使用ColorUtils类执行类似的操作:
class ColorUtils{
public static final Map<String, int[]> COLOR_MAP;
static{
COLOR_MAP = new HashMap<>();
COLOR_MAP.put("red", new int[]{255,0,0});
COLOR_MAP.put("blue", new int[]{0, 0, 255});
COLOR_MAP.put("green", new int[]{0, 255,0});
...
... //add more colors here
}
public static double findDist(int[] rgb, int[] color){
int deltaR = color[0] - rgb[0];
int deltaG = color[1] - rgb[1];
int deltaB = color[2] - rgb[2];
return (Math.pow(deltaR, 2) + Math.pow(deltaG, 2) + Math.pow(deltaB, 2));
}
public static String findClosestColor(int[] rgb, Map<String, int[]> colorMap){
int min = Integer.MAX_VALUE;
String color = null;
double dist;
for(Entry<String, int[]> entry : colorMap.entrySet()){
dist = findDist(rgb, entry.getValue());
if(dist < min){
dist = min;
color = entry.getKey();
}
}
return color;
}
}
如此测试:
int[] teal = {2, 132, 130};
System.out.print(findClosestColor(teal, colorMap));
让您在Android中进行测试:
public boolean onTouch(View view,MotionEvent event){
x=(int)event.getX()-(radius/2);
y=(int)event.getY()-(radius/2);
randColor();
invalidate();
Toast.makeText(getContext(),
ColorUtils.findClosestColor(new int[]{r, g, b}, ColorUtils.COLOR_MAP), Toast.LENGTH_LONG).show();
return true;
}
为了您的利益,将这两种方法添加到实用程序类中,并静态创建颜色映射,您将在其中填充您希望向用户表达的颜色。没有已知的库(TO MY KNOWLEDGE!)能够将RGB映射到可以用Java轻松访问的颜色。我错了,但我也认为这是你最好的方式。
注意:最好将Toast.makeText()调用作为另一个方法存储在一个单独的utils类中(如果我使用Toasts,我会这样做)所以它会稍微清理一下代码
class AndroidUtils{
public static void createToast(Context context, String str){
Toast.makeText(context, str, Toast.LENGTH_LONG).show();
}
}
然后只需要调用它来代替上面的吐司:
AndroidUtils.createToast(getContext(), ColorUtils.findClosestColor(new int[]{r, g, b}, ColorUtils.COLOR_MAP));