Я внедряю функцию "тегирования" в своем приложении, и один из способов, которым я позволяю отображать теги, - это установить для каждого из них цвет текста, выбранный пользователем. В моем приложении есть три темы с белым, черным и коричневым фоном, похожим на блокнот (в будущем они могут измениться или увеличиться). Я хочу иметь возможность отображать тег в его родном цвете, если он легко контрастирует с фоном, и просто использовать цвет текста по умолчанию для каждой темы.
Я написал вспомогательную функцию, которая поможет мне определить, будет ли текст маскироваться, но она не на 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;
}
При вызове этой функции с синим, красным, прозрачным, черным, желтым и зеленым цветами вывод получается следующим (соответственно):
Мой вопрос: на основе оттенка, насыщенности и значения, как определить, будет ли текст, окрашенный определенным образом, отображаться на белом фоне по сравнению с черным фоном или он будет замаскирован? Пожалуйста, возьмите мой алгоритм и улучшите его или помогите мне создать новый.
Заранее спасибо.