Я внедряю функцию «тегирования» в своем приложении, и один из способов, позволяющих отображать теги, состоит в том, чтобы установить для текста цвет, выбранный пользователем для каждого. Мое приложение имеет три темы с фонами: белый, черный и блокнот, как коричневый (они могут измениться / расти в будущем). Я хочу иметь возможность отображать тег в его родном цвете, если он легко контрастирует с фоном, и просто использовать цвет текста по умолчанию для каждой темы.
Я написал вспомогательную функцию, которая поможет мне определить, будет ли текст замаскирован, но он не на 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;
}
При вызове этой функции с синим, красным, прозрачным, черным, желтым и зеленым цветом результат будет следующим (соответственно):
- ч = 0,0, с = 1,0, v = 1,0, тема = 1
- ч = 229,41177, с = 1,0, v = 1,0, тема = 1
- h = 267,6923, s = 1,0, v = 0,050980393, тема = 1
- h = 0,0, s = 0,0, v = 0,0, тема = 1
- ч = 59,52941, с = 1,0, v = 1,0, тема = 1
- ч = 111,29411, с = 1,0, v = 1,0, тема = 1
Мой вопрос: на основе оттенка, насыщенности и значения, как вы можете определить, будет ли текст, окрашенный определенным образом, отображаться на белом фоне по сравнению с черным фоном или будет ли он замаскирован? Пожалуйста, возьмите мой алгоритм и улучшите его или помогите мне создать новый.
Заранее спасибо.