Устройства-трансформеры или «2 в 1» (планшет + ультрабук) пока еще не стали мейнстримом, но уже популярны у пользователей, желающих получить максимально универсальное решение для как можно более широкого круга задач. Однако с точки зрения разработчиков ПО данный класс гаджетов имел одну неприятную особенность: если сенсорный интерфейс уже хорошо изучен и апробирован, то адаптивность, то есть способность определять текущее состояние трансформера и соответствующим образом подстраивать интерфейс приложения, ранее не реализовалась и потому нуждалась в самостоятельном изобретении.
В этом посте мы опишем, как с решением данной проблемы справились создатели графического редактора Krita Gemini. А в его конце – заманчивое предложение Intel для всех разработчиков ПО для устройств «2 в 1». У вас есть возможность получить новейший трансформер для рабочих нужд совершенно бесплатно!
Устройства «2 в 1» могут переключаться между режимами планшета и ноутбука разными способами; аналогично можно создать и программу таким образом, чтобы она разными способами реагировала на переключение режимов. В некоторых случаях в режиме планшета следует сохранить пользовательский интерфейс как можно более близким к режиму ноутбука; в других случаях можно внести довольно существенные изменения. Корпорация Intel сотрудничает со многими поставщиками, чтобы помочь им реализовать разные режимы работы трансформеров в своих приложениях.
Разработчики Gemini постарались максимально использовать все возможности интерфейса в обоих режимах работы. На рисунках ниже видно, что пользовательский интерфейс в двух режимах отличается очень сильно. Это дает пользователю возможность плавно перейти от рисования «в поле» в режиме планшета к ретушированию и проработке более тонких деталей в режиме ноутбука.
Пользовательский интерфейс Krita Gemini в режиме планшета
Пользовательский интерфейс Krita Gemini в режиме ноутбука
Для автоматического переключения требуется определить состояние датчика, отслеживать его и выполнять соответствующие действия при известном состоянии. Кроме того, для удобства пользователей следует добавить и возможность переключать режимы работы приложения вручную.
Не все компьютеры с сенсорным управлением поддерживают автоматическое переключение, поэтому мы рекомендуем добавить в приложение кнопку, с помощью которой пользователи могли бы вручную переключать режимы работы приложения. Кнопка Gemini показана на рисунке. Смена пользовательского интерфейса по нажатию кнопки происходит так же, как при срабатывании механического датчика. Информация на экране и устройство ввода по умолчанию изменятся с сенсорного экрана и крупных значков в режиме планшета на клавиатуру, мышь и мелкие значки в режиме ноутбука. Тем не менее, поскольку датчик не срабатывал, метод, использующий кнопку, должен сменять параметры экрана, значков и устройства ввода по умолчанию без получения данных о состоянии датчика.
Кнопка переключения Switch to Sketch — переключение в режим планшета запускается пользователем
// Snip from Gemini - Define 2-in1 mode hardware states:
#ifdef Q_OS_WIN
#include <shellapi.h>
#define SM_CONVERTIBLESLATEMODE 0x2003
#define SM_SYSTEMDOCKED 0x2004
#endif
Определение кнопки Kaction(), ее состояния и действия показаны в коде ниже:
// Snip from Gemini - Define 2-in1 Mode Transition Button:
toDesktop = new KAction(q);
toDesktop->setEnabled(false);
toDesktop->setText(tr("Switch to Desktop"));
SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), q, SLOT(switchDesktopForced()));
connect(toDesktop,
SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), q, SLOT(switchToDesktop()));
sketchView->engine()->rootContext()->setContextProperty("switchToDesktop
sketchView->Action", toDesktop);
Затем разработчики занялись обработкой событий, переключаемых кнопкой. Сначала нужно проверить последнее известное состояние системы, затем идет смена режима:
// Snip from Gemini - Perform 2-in1 Mode Transition via Button:
#ifdef Q_OS_WIN
bool MainWindow::winEvent( MSG * message, long * result ) {
if (message && message->message == WM_SETTINGCHANGE && message->lParam)
{
if (wcscmp(TEXT("ConvertibleSlateMode"), (TCHAR *) message->lParam) == 0)
d->notifySlateModeChange();
else if (wcscmp(TEXT("SystemDockMode"), (TCHAR *)
message->lParam) == 0)
d->notifyDockingModeChange();
*result = 0;
return true;
}
return false;
}
#endif
void MainWindow::Private::notifySlateModeChange()
{
#ifdef Q_OS_WIN
bool bSlateMode = (GetSystemMetrics(SM_CONVERTIBLESLATEMODE) == 0);
if (slateMode != bSlateMode)
{
slateMode = bSlateMode;
emit q->slateModeChanged();
if (forceSketch || (slateMode && !forceDesktop))
{
if (!toSketch || (toSketch && toSketch->isEnabled()))
q->switchToSketch();
}
else
{
q->switchToDesktop();
}
//qDebug() << "Slate mode is now" << slateMode;
}
#endif
}
void MainWindow::Private::notifyDockingModeChange()
{
#ifdef Q_OS_WIN
bool bDocked = (GetSystemMetrics(SM_SYSTEMDOCKED) != 0);
if (docked != bDocked)
{
docked = bDocked;
//qDebug() << "Docking mode is now" << docked;
}
#endif
}
Код приложения Krita для управления переключениями между режимами можно найти в исходном коде этого приложения, выполнив поиск по слову SlateMode. Программа Krita распространяется на условиях лицензии GNU Public License. Для получения последней информации смотрите репозиторий исходного кода.
Полный текст статьи о приложении Krita Gemini вы можете прочитать на сайте IDZ.
Теперь обещанное заманчивое предложение. Если вы разрабатываете ПО для устройств «2 в 1», для вас важна производительность и вы заботитесь об удобстве пользователей и, соответственно, интерфейсе, то как раз для вас у Intel припасено несколько супер современных ПК на базе новейших процессоров Haswell. Вы можете получить один из них для тестирования и отладки, а, возможно, это устройство станет вашим постоянным девайсом для разработки. Напишите нам, расскажите о своей программе и мы обязательно рассмотрим вашу заявку.
И еще одно объявление. 28-29 мая в Подмосковье будет проходить конференция DevCon, в которой, конечно же, будет участвовать и Intel. Во время мероприятия мы пройдемся и по другим наглядным примерам, как адаптировать интерфейс приложений для трансформеров. Приглашаем всех желающих!
Автор: saul