6

アプリケーションに「タグ付け」機能を導入しています。タグを表示できるようにする方法の1つは、ユーザーがそれぞれに選択した色にテキストを設定することです。私のアプリケーションには、背景が白、黒、メモ帳のような茶色の3つのテーマがあります(これらは将来変更/拡大する可能性があります)。タグが背景と簡単に対比できる場合はネイティブカラーで表示できるようにし、それ以外の場合は各テーマのデフォルトのテキストカラーを使用できるようにします。

テキストがマスクされるかどうかを判断するのに役立つヘルパー関数を作成しましたが、100%正確ではありません(3つの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

私の質問は、色相、彩度、値に基づいて、特定の方法で色付けされたテキストが白い背景と黒い背景のどちらに表示されるか、またはマスクされるかどうかをどのように判断できますか?私のアルゴリズムを採用して改善するか、新しいアルゴリズムの作成を手伝ってください。

前もって感謝します。

4

1 に答える 1

4

私が思いついた解決策:

私はこのブログにあるアルゴリズムを使用して、次のように関数を再定義することになりました。次に、両端の明るさのカットオフを調整しました。これが誰かを助けることを願っています。

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;
}
于 2014-09-16T20:34:49.643 に答える