Использование клавиатуры с WebView
Данная статья относится к выводу web-страниц с помощью gecko, и не относится к chromium.
- Потеря производительности при открытии клавиатуры в приложении при использовании WebView
- Оптимизация производительности при работе с клавиатурой в WebView
- WebView::virtualKeyboardMargin
- WebView::addMessageListener(string name)
- WebView::loadFrameScript(string name)
- runJavaScript-method
Потеря производительности при открытии клавиатуры в приложении при использовании WebView
Если высота WebView привязана к клавиатуре, то при её открытии размеры контента будут многократно пересчитываться. Так как рендеринг контента является ресурсозатратным, такой подход может привести к сильному падению производительности.
Для оптимизации производительности можно задавать размеры WebView самостоятельно.
Оптимизация производительности при работе с клавиатурой в WebView
Существует два основных случая, при которых используется клавиатура в Webview:
Использование поля ввода в приложении
В данном примере рассмотрено QML-поле text-edit TextField.
Рекомендуется делать поля ввода в верхней части экрана, а высоту WebView задавать фиксированным
значением, учитывая ориентацию устройства и текущие отступы безопасной зоны в данной ориентации,
так как по умолчанию в ApplicationWindow установлен режим ApplicationDisplayMode.SafeZone,
который учитывает безопасную зону SafeZoneRect.
Ниже приведен пример кода, учитывающий высоту footer при использовании поля ввода в нижней
части страницы:
Page {
property real cutoutOffset: {
switch (orientation) {
case Orientation.Portrait: return Math.max(SafeZoneRect.insets.top, SafeZoneRect.appInsets.top)
case Orientation.Landscape: return Math.max(SafeZoneRect.insets.left, SafeZoneRect.appInsets.top)
case Orientation.PortraitInverted: return Math.max(SafeZoneRect.insets.bottom, SafeZoneRect.appInsets.top)
case Orientation.LandscapeInverted: return Math.max(SafeZoneRect.insets.right, SafeZoneRect.appInsets.top)
}
}
WebView {
anchors {
top: parent.top
left: parent.left
right: parent.right
}
height: {
switch(root.orientation) {
case Orientation.Portrait: {
return Screen.height - cutoutOffset - pageFooter.height
}
case Orientation.Landscape: {
return Screen.width - cutoutOffset - pageFooter.height
}
// Здесь можно добавить аналогичные расчеты высоты для других ориентаций
}
}
footerMargin: cutoutOffset + pageFooter.height
}
Rectangle {
id: pageFooter
// Пользовательский код
TextField {
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
}
// Пользовательский код
}
}
}
Размер footerMargin (отступ для footer web-страницы) для WebView
нужно задать c учётом отступов безопасной зоны и с учётом высоты пользовательского footer
для Page, а при выдвижении клавиатуры footer WebView автоматически сдвигается на высоту
клавиатуры.
Ниже приведён пример кода, задающий необходимый отступ для footer web-страницы:
WebView {
...
footerMargin: cutoutOffset + pageFooter.height
}
Заполнение полей ввода web-страницы
Для уменьшения количества пересчётов размеров, можно сдвигать WebView вручную с учётом высоты клавиатуры и с учётом местонахождения фокусного элемента (поиск в DOM-документе), используя Дополнительные атрибуты WebView, а также Основные свойства WebView:
WebView::virtualKeyboardMargin
-
qreal WebView::virtualKeyboardMargin— поле, занимаемое клавиатурой внизу страницы (высота клавиатуры). -
bool WebView::keyboardOpened— клавиатура открыта/закрыта.
WebView::addMessageListener(string name)
WebView::addMessageListener(string name)— регистрирует прослушиватель асинхронных событий с указанным значениемname.
WebView::loadFrameScript(string name)
WebView::loadFrameScript(string name)— загружает указанный JS-скрипт фрейма.
runJavaScript-method
runJavaScript(string script, variant callback, variant errorCallback)— запускает фрагмент JavaScript в контексте загруженного документа DOM.
Например, можно подвинуть Webview вверх на расстояние равное разнице между высотой клавиатуры
(WebView::virtualKeyboardMargin) и расстоянием от фокусного элемента до нижнего края страницы.
Результатом применения описанных подходов будет плавное появление и скрытие клавиатуры.