Ориентация дисплея tft

Картинки по запросу ORIENTATION_LANDSCAPE

Вступление

Дисплеи имеют фиксированную начальную точку, в которую записывается первое значение пикселя, полученное от TFT-контроллера, и фиксированное направление, в котором записываются следующие пиксели. Как правило, TFT-дисплеи созданы для альбомной или портретной ориентации, хотя некоторые из них можно настраивать.

Для поддержки как альбомной, так и книжной ориентации для пользовательских интерфейсов TouchGFX имеет встроенный механизм для поворота пользовательского интерфейса, так что, например, портретный пользовательский интерфейс может быть реализован на дисплее, который изначально работает в ландшафтном режиме. Это вращение применяется без затрат производительности; Таким образом, время рендеринга не увеличивается, если ваш дизайн пользовательского интерфейса не соответствует исходной ориентации дисплея.

  • TouchGFX может поворачивать ваше приложение только на 90 градусов в буфере кадров. Во многих случаях сами дисплеи могут быть настроены на поворот положения данных, которые он получает от TFT-контроллера, на 180 градусов. В некоторых случаях (STM32L4) контроллер TFT может вращать буфер кадров перед отправкой его на дисплей. 

конфигурация

Чтобы достичь этого, TouchGFX должен быть проинформирован о том, какова исходная ориентация самого дисплея. Это делается в BoardConfiguration, где уровень аппаратной абстракции информируется о ширине и высоте отображения в пикселях. Если ширина больше высоты, исходная ориентация определяется как альбомная. Если пользовательский интерфейс, который вы реализуете, имеет ту же ориентацию дисплея, что и ваш фактический TFT-дисплей, ничего особенного делать не нужно, поскольку поведение по умолчанию соответствует ориентации самого дисплея. Однако, если ваш пользовательский интерфейс, например, книжный, а ваш дисплей горизонтальный, вам нужно явно изменить ориентацию во время выполнения, вызвав функцию

//Switch to portrait mode.
HAL::getInstance()->setDisplayOrientation(ORIENTATION_PORTRAIT); 

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

Необходимые преобразования координат происходят за сценой. Ширина и высота корневого контейнера вашего вида, сенсорных координат ввода и координат виджета все выражаются в координатном пространстве, обозначенном выбранной вами ориентацией отображения для пользовательского интерфейса. Таким образом, разработчик приложения должен иметь дело только с одной вещью, касающейся ориентации отображения, и это касается растровых изображений и описывается в следующем разделе.

Графические данные в неориентированной ориентации пользовательского интерфейса Если ориентация вашего пользовательского интерфейса отличается от исходной ориентации TFT-дисплея, все графические данные должны генерироваться с определенным флагом. Это приведет к тому, что двоичные данные пикселей будут представлены в другом формате в целевом объекте, что позволяет TouchGFX отображать повернутый дисплей без снижения производительности. Поэтому при настройке проекта необходимо знать, отличается ли ориентация пользовательского интерфейса от исходной ориентации. Если это так, измените, config/gcc/app.mkчтобы указать следующее:

screen_orientation := -rotate90

И аналогично для config / msvc / Application.props при использовании Visual Studio для генерации ресурсов:

<RotateImage90>true</RotateImage90>

В итоге флаг rotate90 должен быть применен к генерации вашего актива, если выполняется одно из следующих условий:

  • Ваше приложение находится в портретном режиме, а дисплей изначально находится в ландшафтном режиме, или
  • Ваше приложение находится в ландшафтном режиме, а дисплей изначально в портретном режиме.

Пример пользовательского интерфейса в альбомной и портретной ориентации

Вращение холста в дизайнере

При создании приложения из конструктора ориентация по умолчанию соответствует исходному разрешению шаблона целевого приложения. Например, для набора STM32F769-DISCOVERY разрешение составляет 800 x 480 (альбомная ориентация). 

примечание: для поддерживаемых плат это разрешение не может быть изменено через конструктор из-за их фиксированных конфигураций экрана, но файл .touchgfx можно редактировать вручную для настройки холста. Например, изменив разрешение на 480 x 800 портрет:

  "Resolution": { "Width": 480, "Height": 800 },

В конструкторе нажмите на кнопку «Просмотреть код», найдите .touchgfx и откройте в текстовом редакторе. Измените настройки разрешения, меняя значения ширины и высоты
с: "Resolution": { "Width": 800, "Height": 480 }
на:      "Resolution": { "Width": 480, "Height": 800 }

Вернитесь в окно дизайнера и нажмите «ОК», чтобы перезагрузить проект, холст теперь должен быть повернут на 90 градусов.

Настройка симулятора

Чтобы симулятор отражал повернутую ориентацию, необходимо внести следующие изменения в simulator / main.cpp

Переключите SIM_WIDTH и SIM_HEIGHT в методе touchgfx_generic_init так

touchgfx_generic_init<HALSDL2>(dma, lcd, tc, SIM_WIDTH, SIM_HEIGHT, 0, 0); 

становится 

touchgfx_generic_init<HALSDL2>(dma, lcd, tc, SIM_HEIGHT, SIM_WIDTH, 0, 0); 

В следующей строке добавьте следующую строку, чтобы проинформировать слой HAL об ориентации активов.

//Switch to portrait mode.
HAL::getInstance()->setDisplayOrientation(ORIENTATION_PORTRAIT); 

Динамическое переключение во время выполнения

Если приложение должно поддерживать как альбомный, так и портретный режимы, TouchGFX позволяет во время выполнения переключаться между ориентациями.

Если необходимо поддерживать обе ориентации, то растровые изображения, которые должны отображаться в ориентации, соответствующей исходной ориентации отображения, должны создаваться без поворота, тогда как растровые изображения для отображения в неориентированной ориентации должны создаваться с параметром -rotate90. Для этого в механизме генерации ресурсов TouchGFX встроена поддержка ротации для каждой битовой карты вместо глобальных флагов -rotate. Поэтому при наличии обеих ориентаций установите для переменной screen_orientation пустую строку (или -rotate0). Затем нам нужно переопределить этот параметр для растровых изображений в неориентированной ориентации, например, портретных растровых изображений на родном альбомном дисплее. TouchGFX имеет соглашение об именах, касающееся растровых изображений, которое означает, что ориентация может быть изменена из глобальной настройки, включая «.90.

icon.90.png будет сгенерирован с ключом -rotate90 автоматически.

Поскольку корневой контейнер вашего вида должен быть изменен на новые размеры при переключении ориентации, необходимо выполнить переход экрана после переключения ориентации. Этот переход может быть либо другим видом / докладчиком, либо тем же видом / докладчиком, который отображается в данный момент. Например:

#include <gui/common/FrontendApplication.hpp>
#include <touchgfx/hal/HAL.hpp>
void MyView::performOrientationChange(DisplayOrientation orientation)
{
  HAL::getInstance()->setDisplayOrientation(orientation); //set new orientation
  static_cast<FrontendApplication*>(Application::getInstance())->gotoMyScreen(); //switch screen (to the same screen we are currently displaying).
}

Возможность повторного использования одного и того же экрана для обеих ориентаций или создание альбомной и портретной версий экрана зависит, прежде всего, от различий между ними. Обычно различаются только координаты виджета и идентификаторы растрового изображения, и поэтому проще использовать один и тот же вид / презентатор и просто проверять текущую ориентацию в функции setupScreen, например:

void MyView::setupScreen()
{
  bg.setXY(0, 0);
  if (HAL::getInstance()->getDisplayOrientation() == ORIENTATION_LANDSCAPE)
  {
    bg.setBItmap(BITMAP_BG_ID);
    icon.setBitmap(BITMAP_ICON_ID);
    icon.setXY(200, 20);
  }
  else //Portrait
  {
    bg.setBItmap(BITMAP_BG_90_ID);
    icon.setBitmap(BITMAP_ICON_90_ID);
    icon.setXY(40, 30);
  }
  add(bg);
  add(icon);
}

Примечание. В приведенном выше примере исходная ориентацияlandscapeозначает, что растровые изображения, используемые в портретном режиме, имеют суффикс .90. как уже упоминалось ранее.

Добавить комментарий

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru