2011-10-16 10 views
6

मैं अपने आवेदन में "टैगिंग" कार्यक्षमता पेश कर रहा हूं, और टैग्स को प्रदर्शित करने की अनुमति देने के तरीकों में से एक यह है कि टेक्स्ट को उस रंग पर सेट करें जिसे उपयोगकर्ता ने प्रत्येक के लिए चुना है। मेरे आवेदन में पृष्ठभूमि के साथ तीन थीम हैं जो सफेद, काले और नोटपैड-जैसे ब्राउन हैं (ये भविष्य में बदल सकते हैं/बढ़ सकते हैं)। मैं अपने देशी रंग में टैग को प्रदर्शित करने में सक्षम होना चाहता हूं अगर यह पृष्ठभूमि को आसानी से विपरीत करता है, और अन्य थीम के लिए डिफ़ॉल्ट टेक्स्ट रंग का उपयोग करें।एंड्रॉइड/जावा: यह निर्धारित करना कि पाठ रंग पृष्ठभूमि के साथ मिश्रण करेगा या नहीं?

मैंने यह निर्धारित करने में मदद करने के लिए एक सहायक कार्य लिखा है कि पाठ को मुखौटा किया जाएगा, लेकिन यह 100% सही नहीं है (मैं यह निर्धारित करना चाहता हूं कि रंगों को तीनों एचएसवी घटकों के आधार पर मुखौटा किया जाएगा, और दाएं अब संतृप्ति तुलना वैध नहीं है)। कोड नीचे है।

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

जब नीले, लाल, पारदर्शी, काले, पीले और हरे रंग उत्पादन इस प्रकार है (क्रमशः) के साथ इस कार्यप्रणाली को कॉल:

  • एच = 0.0, एस = 1.0, वी = 1.0, विषय = 1
  • एच = २२९.४१,१७७, एस = 1.0, वी = 1.0, विषय = 1
  • एच = 267.6923, रों 1.0 =, वी = 0.०५,०९,८०,३९३, विषय = 1
  • एच = 0.0, एस = 0.0, वी = 0.0, थीम = 1
  • एच = 59.529 41, एस = 1.0, वी = 1.0, विषय = 1
  • एच = १११.२९४११, एस = 1.0, वी = 1.0, विषय = 1

मेरा प्रश्न है: रंग, संतृप्तता और मूल्य के आधार पर, कैसे क्या आप यह निर्धारित कर सकते हैं कि एक निश्चित तरीके से रंगीन पाठ एक सफेद पृष्ठभूमि पर एक काला पृष्ठभूमि बनाम दिखाई देगा या यदि इसे मुखौटा किया जाएगा? कृपया मेरा एल्गोरिदम लें और इसे सुधारें या मुझे नया बनाने में मदद करें।

अग्रिम धन्यवाद।

+0

क्या के लिए धन्यवाद? आपने एक सवाल भी नहीं पूछा, लेकिन फिर भी: आपका स्वागत है। – Stephan

+0

पाठ को अपडेट किया गया, क्षमा करें, मैं स्पष्ट नहीं था। – Blaskovicz

उत्तर

3

समाधान है कि मैं के साथ आया था:

मैं एक कलन विधि का उपयोग समाप्त हो गया on this blog पाया मेरी समारोह को फिर से परिभाषित करने के लिए इस प्रकार है; फिर मैंने प्रत्येक छोर पर चमक कट ऑफ को समायोजित किया। उम्मीद है कि यह किसी की मदद करता है।

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

ध्यान दें कि स्रोत के चमक गुणांक [अन्य स्रोत] (http://alienryderflex.com/hsp.html) से आए थे, जो कि अलग-अलग गुणांक निर्दिष्ट करने के लिए स्वयं ही बदल दिए गए थे, जिनके लेखक को "सूचित किया गया है ... अधिक सटीक ": .29 9, .587, .114। –

संबंधित मुद्दे