2011-10-16 15 views
6

Uygulamamda "etiketleme" işlevini tanıyorum ve etiketlerin gösterilmesine izin verdiğim yöntemlerden biri, metni kullanıcının seçtiği renkle ayarlamaktır. Uygulamamın beyaz, siyah ve not defteri benzeri bir arka plana sahip üç teması var (bunlar gelecekte değişebilir/büyüyebilir). Etiketi arka planını kolayca karşılıyorsa ve normalde her tema için varsayılan metin rengini kullanıyorsa etiketi yerel renginde görüntülemek istiyorum.Android/Java: Metin renginin arka planla karışıp karışmayacağını belirleme

Metnin maskelenip gizlenmeyeceğini belirlemede yardımcı olan bir yardımcı işlev yazdım, ancak% 100 doğru değil (hsv bileşenlerinin üçüne göre renklerin maskelenip gizlenmeyeceğini belirlemek istiyorum) şimdi doygunluk karşılaştırması geçerli değil). Kod aşağıda.

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

(sırasıyla), mavi, kırmızı, şeffaf, siyah, san ve çıkış aşağıdaki gibidir, yeşil ile işlevinin çağrılması :

  • h = 0.0, s = 1.0, v = 1.0, teması = 1
  • h = 229,41177, s v = ,050980393 tema = 1
  • h = 0.0, s 0,0 =, v = 1.0, tema = 1
  • h = 267,6923, s = 1.0, 1.0 =, v = 0.0, tema = 1
  • h = 59.529 41, s = 1.0, v = 1.0, tema = 1
  • h = 111,29411, s = 1.0, v = 1.0, tema = 1 Benim soru

: renk tonu, doyma ve değerine göre ne Belirli bir şekilde renklendirilmiş metnin beyaz bir arka plan üzerinde siyah bir arka plan mı yoksa maskelenecek mi olacağını belirleyebilir misiniz? Lütfen algoritmamı al ve geliştir, ya da yeni bir tane oluşturmama yardım et.

Şimdiden teşekkürler. Ben ile geldi

+0

Ne için teşekkürler? Bir soru sormadın, ama yine de: Rica ederim. – Stephan

+0

Metin güncellendi, üzgünüm açık değildi. – Blaskovicz

cevap

3

Çözüm: Ben bir algoritma kullanarak sona erdi

şöyle benim işlevini yeniden tanımlamak için on this blog bulundu; Daha sonra her bir uçtaki parlaklık ayarını değiştirdim. Umarım bu birisine yardım eder.

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

Kaynağın parlaklık katsayılarının, başka bir kaynaktan (http://alienryderflex.com/hsp.html) geldiğine dikkat edin, ki bu arada yazarın “hakkında bilgi verildiği için farklı katsayıları belirtmek için değişti. daha doğru ": .299, .587, .114. –

İlgili konular