Android/Java: Определение того, будет ли цвет текста сливаться с фоном?

Я внедряю функцию "тегирования" в своем приложении, и один из способов, которым я позволяю отображать теги, - это установить для каждого из них цвет текста, выбранный пользователем. В моем приложении есть три темы с белым, черным и коричневым фоном, похожим на блокнот (в будущем они могут измениться или увеличиться). Я хочу иметь возможность отображать тег в его родном цвете, если он легко контрастирует с фоном, и просто использовать цвет текста по умолчанию для каждой темы.

Я написал вспомогательную функцию, которая поможет мне определить, будет ли текст маскироваться, но она не на 100% корректна (я хочу, чтобы она определяла, будут ли цвета маскироваться на основе всех трех компонентов hsv, а сейчас сравнение насыщенности не работает). Код приведен ниже.

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

При вызове этой функции с синим, красным, прозрачным, черным, желтым и зеленым цветами вывод получается следующим (соответственно):

  • h=0.0, s=1.0, v=1.0, theme=1
  • h=229.41177, s=1.0, v=1.0, theme=1
  • h=267.6923, s=1.0, v=0.050980393, theme=1
  • h=0.0, s=0.0, v=0. 0, theme=1
  • h=59.52941, s=1.0, v=1.0, theme=1
  • h=111.29411, s=1.0, v=1.0, theme=1

Мой вопрос: на основе оттенка, насыщенности и значения, как определить, будет ли текст, окрашенный определенным образом, отображаться на белом фоне по сравнению с черным фоном или он будет замаскирован? Пожалуйста, возьмите мой алгоритм и улучшите его или помогите мне создать новый.

Заранее спасибо.

6
задан Blaskovicz 16 September 2014 в 20:35
поделиться