texto studio programacion móviles letra desarrollo curso como color cambiar aplicaciones java android colors textview hsv

java - studio - curso android desarrollo de aplicaciones móviles pdf



Android/Java: ¿Determinar si el color del texto se combinará con el fondo? (1)

Estoy introduciendo la funcionalidad de "etiquetado" en mi aplicación, y una de las formas en que permite que se muestren las etiquetas es establecer el texto al color que el usuario ha seleccionado para cada una. Mi aplicación tiene tres temas con fondos que son blancos, negros y marrones con forma de bloc de notas (estos podrían cambiar / crecer en el futuro). Quiero poder mostrar la etiqueta en su color original si contrasta fácilmente el fondo, y solo usar el color de texto predeterminado para cada tema.

He escrito una función auxiliar para ayudarme a determinar si el texto se enmascarará, pero no es 100% correcto (quiero que determine si los colores estarán enmascarados en función de los tres componentes de la hsv, y ahora la comparación de saturación no es válido). El código está abajo.

public static boolean colorWillBeMasked(int color, Application app){ float[] hsv = new float[3]; Color.colorToHSV(color, hsv); //note 0, black 1, white 2 int theme = app.api.getThemeView(); System.out.println("h=" +hsv[0]+ ", s=" +hsv[1]+ ", v=" +hsv[2]+", theme="+theme); if(android.R.color.transparent == color) return true; // color is dark if(hsv[2] <= .2){ if(theme == 1) return true; } // color is light else if(hsv[2] >= .8) { if(theme == 2) return true; } return false; }

Cuando se llama a esta función con azul, rojo, transparente, negro, amarillo y verde, la salida es la siguiente (respectivamente):

  • h = 0.0, s = 1.0, v = 1.0, tema = 1
  • h = 229.41177, s = 1.0, v = 1.0, tema = 1
  • h = 267.6923, s = 1.0, v = 0.050980393, tema = 1
  • h = 0.0, s = 0.0, v = 0.0, tema = 1
  • h = 59.52941, s = 1.0, v = 1.0, tema = 1
  • h = 111.29411, s = 1.0, v = 1.0, tema = 1

Mi pregunta es: en función del tono, la saturación y el valor, ¿cómo se puede determinar si el texto que está coloreado de cierta manera aparecerá en un fondo blanco frente a un fondo negro o si se enmascarará? Por favor toma mi algoritmo y mejora o ayúdame a crear uno nuevo.

Gracias por adelantado.


Solución que se me ocurrió:

Terminé usando un algoritmo que se encuentra en este blog para redefinir mi función de la siguiente manera; Luego ajusté el corte de brillo en cada extremo. Espero que esto ayude a alguien.

public static boolean colorWillBeMasked(int color, Application app){ if(android.R.color.transparent == color) return true; int[] rgb = {Color.red(color), Color.green(color), Color.blue(color)}; int brightness = (int)Math.sqrt( rgb[0] * rgb[0] * .241 + rgb[1] * rgb[1] * .691 + rgb[2] * rgb[2] * .068); System.out.println("COLOR: " + color + ", BRIGHT: " + brightness); //note 0,black 1,classic 2 int theme = app.api.getThemeView(); // color is dark if(brightness <= 40){ if(theme == 1) return true; } // color is light else if (brightness >= 215){ if(theme == 2) return true; } return false; }