2011-10-16 6 views
6

Sto introducendo la funzionalità "tagging" nella mia applicazione e uno dei modi in cui permetto ai tag di essere visualizzato è quello di impostare il testo sul colore che l'utente ha selezionato per ciascuno. La mia applicazione ha tre temi con sfondi bianchi, neri e un marrone simile a un blocco note (questi potrebbero cambiare/crescere in futuro). Voglio essere in grado di visualizzare il tag nel suo colore nativo se facilmente contrasta lo sfondo, e basta usare il colore del testo predefinito per ogni tema altrimenti.Android/Java: Determinare se il colore del testo si fonde con lo sfondo?

Ho scritto una funzione di supporto per aiutarmi a determinare se il testo verrà mascherato, ma non è corretto al 100% (voglio determinare se i colori saranno mascherati in base a tutti e tre i componenti hsv e a destra ora il confronto di saturazione non è valido). Il codice è sotto

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; 
    } 

Nel richiamo con blu, rosso, trasparente, nero, giallo e verde l'uscita è la seguente (rispettivamente):

  • h = 0,0, s = 1,0, v = 1,0, theme = 1
  • h = 229,41,177 mila, s = 1,0, v = 1,0, theme = 1
  • h = 267,6923, s = 1,0, v = ,050,980393 millions, theme = 1
  • h = 0,0, s = 0,0, v = 0.0, theme = 1
  • h = 59,529 41, s = 1.0, v = 1,0, theme = 1
  • h = 111,29,411 mila, s = 1.0, v = 1,0, theme = 1

La mia domanda è: in base a tonalità, saturazione e valore, come puoi determinare se il testo colorato in un determinato modo verrà visualizzato su uno sfondo bianco o su uno sfondo nero o se verrà mascherato? Per favore prendi il mio algoritmo e miglioralo o aiutami a crearne uno nuovo.

Grazie in anticipo.

+0

Grazie per cosa? Non hai nemmeno fatto una domanda, ma comunque: sei il benvenuto. – Stephan

+0

Aggiornato il testo, mi dispiace non è stato chiaro. – Blaskovicz

risposta

3

Soluzione che mi si avvicinò con:

ho finito per usare un algoritmo trovato on this blog di ridefinire la mia funzione come segue; Ho quindi regolato il taglio della luminosità su ciascuna estremità. Spero che questo aiuti qualcuno.

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; 
} 
+0

Si noti che i coefficienti di luminosità della sorgente provengono da [un'altra fonte] (http://alienryderflex.com/hsp.html), che nel frattempo è stata modificata per specificare i diversi coefficienti che il suo autore ha "da quando è stato informato ... sono più preciso ": .299, .587, .114. –

Problemi correlati