Ширина и высота строки в пикселях
- Войдите на сайт для отправки комментариев
Пт, 13/04/2018 - 01:53
Всем привет!
Вопросы касаются дисплея от "Nokia" (1.44 128x128). Используется библиотека "SPI.h", "Adafruit_GFX.h" и "TFT_ILI9163C.h".
Первый вопрос: как узнать высоту и ширину строки в пикселях, которая отрисовывается на дисплее? (Нужно, чтобы отрисовать строку ровно по середине. А не подбирать вручную)
Второй вопрос: есть функция "setTextSize", которая может принимать 3 значения (1,2 и 3). Значение 1 для меня слишком маленькое, а 2 - слишком большое. Можно ли как-то изменить размер внутри библиотеки?
Заранее спасибо!
Первый вопрос: как узнать высоту и ширину строки в пикселях, которая отрисовывается на дисплее? (Нужно, чтобы отрисовать строку ровно по середине. А не подбирать вручную)
Высоту - посмотреть высоту шрифта в библиотеке. Ширину - сложить вместе ширину всех напечатанных символов.
Второй вопрос: есть функция "setTextSize", которая может принимать 3 значения (1,2 и 3). Значение 1 для меня слишком маленькое, а 2 - слишком большое. Можно ли как-то изменить размер внутри библиотеки?
Можно добавить свой шрифт или залезть в библиотеку и поменятьсуществующий.
Покопался в исходниках и нашел ответ на первый вопрос:
Чтобы найти высоту и ширину дисплея, надо использовать функции "height()" и "width()" соответственно.
Для определения высоты и ширины строки существует функция "getTextBounds(char*, int16_t, int16_t, int16_t*, int16_t*, uint16_t*, uint16_t*)" (более красивый вид "getTextBounds(string, x, y, &x1, &y1, &w, &h)"), где
первый аргумент - строка.
второй - координата x, откуда рисуется строка.
третий - координата y, откуда рисуется строка.
четвертый - в него будет записана координата x1, то есть где заканчивается строка по x.
третий - в него будет записана координата y1, то есть где заканчивается строка по y.
пятый - в него будет записана ширина строки в пикселях.
шестой - в него будет записана высота строки в пикселях.
Получается, чтобы нарисовать строку посередине (по x), нужно вычислить "(width()-w)/2".
Проблемы, которые были замечаны:
1) Функция "getTextBounds" не возвращает x1 и y1 (точнее возвращает "0").
2) В старых версиях библиотеки "Adafruit_GFX.h" функция "getTextBounds" постоянно возвращает значение w и h (ширины и длины) равное"65565". В последней версии на текущую дату, ширина и длина возвращаются корректно, кроме случая, когда строка состоит из русских букв. В этом случае надо поделить w и h на 2. (почему так происходит - не знаю. Найдено экспериментально).
3) Если засунуть строку (то есть переменную типа "String" или просто написать, допустим, "Hello World") в первый аргумент функции "getTextBounds", то появится предупреждение, так как первый аргумент - это "char*", а не "String". На работу это никак не повлияет, но кого-то может смутить, поэтому можно использовать функцию, которая будет преобразовывать "String" в "char*" (функция "string2char" в примере ниже).
Пример:
1) Подключение и определение всего необходимого:
2) Специальные функции:
3) Функции рисования:
4) "Setup" и "Void":
Со второй проблемой пока что не разобрался.
потому что смысл работы с русскими буквами сводится к противоположному сказанному в коментариях кода, функция utf8rus возвращает строку CP1251 из UTF8. однобайтовое значение из двухбайтового. в случае моноширных шрифтов можно смело делить ширину на два, а с пропорциональными будет лажа. читать
Есть версия utf8rus(), которая работает со строками *char: #40 http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...