Перейти к содержанию
Fire Monkey от А до Я
  • 0

Смещается заголовок формы на Android Intel


Andrew

Вопрос

Для проведения опытов на Delphi XE8 использовал два планшета Android:

- Lenovo TAB S8-50LC на базе процессора Intel Atom Z3745: http://www.ixbt.com/portopc/lenovo-tab-s8-50lc.shtml. На нем установлен Android версии 4.4.2. Подключил к USB и, как не странно, тестовая программка "Hello World!" успешно запустилась, хотя думал, что с процессором Intel вообще ничего не получится;

- Prestigio Multipad PMT5777_3G с процессором ARM MediaTek MT8382. На нем установлен Android 4.2.2.

Затем на форму красного цвета бросил зеленый TRectangle, присвоил Align значение Client, а также добавил желтую рамку с помощью свойства Stroke (Thinkness=10). Запустил на Prestigio - выглядит нормально, если не считать не дорисованных уголков (см. красные квадраты). Кстати, на Windows уголки рамки отображаются нормально.

 

MainForm.Top = 25 - видимо, смещение от статус-бара.

 

prestigio_1.png

 

 

Затем запустил на Lenovo и результат получился не такой красивый. Как видим, верх формы почему-то "уехал" за статус-бар, а ее свойство Top равно 0:

 

lenovo_1.png

 

------------------------------------------------------------------------------------------------------------------------------------

 

Поворачиваем планшеты на 90 градусов. На Prestigio все выглядит нормально:

 

prestigio_2.png

 

 

На Lenovo произошло какое-то расстройство:

 

lenovo_2.png

 

 

Как я понял, на Lenovo возникают проблемы с получением высоты статус-бара и размеров экрана при повороте планшета, но с чем это связано - непонятно. Возможно решение где-то в FMX.Platform.Android или глубже. По крайней мере там переменная FStatusBarHeight равна нулю.

На моем примере ниже можно получить правильные размеры и позицию для формы (в т.ч. с учетом статус-бара):

NativeWin := SharedActivity.getWindow;
if NativeWin <> nil then
begin
ContentRect := TJRect.Create;
DecorView := NativeWin.getDecorView;
DecorView.getWindowVisibleDisplayFrame(ContentRect);
end;

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

написано же что в данный момент не поддерживается прямая работа с процессорами intel. то что у вас работает то это через эммулятор арм команд а соответственно возможны любые глюки. в 9 версии в планах было что сделают а сделают или нет хз. 

Ссылка на комментарий
  • 0

В Magnum Labs опубликовали решение проблемы с отображением верхней части формы для Android-устройств с процессором Intel x86. Раньше она уезжала под статус бар. Как и предполагалось, требуется внести поправки в FMX.Platform.Android.

lenovo_2b.jpg

 

Для устранения проблемы необходимо:
==================================
1) скопировать файл FMX.Platform.Android.pas в папку с проектом;
2) внести заменить "родную" функцию
function TWindowManager.RetrieveContentRect: TRect; на приведенную ниже и перекомпилировать проект:

 

function TWindowManager.RetrieveContentRect: TRect;
var
Activity: JActivity;
NativeWin: JWindow;
DecorView: JView;
ContentRectVisible, ContentRect: JRect;
begin
Activity := SharedActivity;
if Activity <> nil then
begin
NativeWin := Activity.getWindow;
if NativeWin <> nil then
begin
FStatusBarHeight := FNewContentRect.Top;
ContentRect := TJRect.Create;
DecorView := NativeWin.getDecorView;
DecorView.getDrawingRect(ContentRect);
// Fix by Flying Wang &
CallInUIThread(
procedure
begin
if (not PlatformAndroid.GetFullScreen(nil)) and
(SharedActivity.getWindow.getAttributes.Flags and
TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN <>
TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN) then
begin
// http://www.2cto.com/kf/201307/227536.html
ContentRectVisible := TJRect.Create;
DecorView.getWindowVisibleDisplayFrame(ContentRectVisible);
if (ContentRect.Top < 1) or
(ContentRectVisible.Top < FStatusBarHeight) then
begin
ContentRect.Top := ContentRectVisible.Top;
FNewContentRect.Top := ContentRectVisible.Top;
FStatusBarHeight := FNewContentRect.Top;
end;
end;
end);
Result := TRect.Create(Round(FNewContentRect.Left / FScale),
Round(FNewContentRect.Top / FScale), Round(ContentRect.Right / FScale),
Round(ContentRect.Bottom / FScale));
end;
end;
end;

 

Ссылка на источник: https://magnumlabs.wordpress.com/2015/10/10/delphiandroid-misalignment-status-bar-on-intel-based-devices/

Изменено пользователем Andrew
Ссылка на комментарий
  • 0

Нашел и устранил последнюю проблему планшета Lenovo TAB S8-50LC (CPU Intel Atom). Не исключаю, что подобная проблема возникает и на других устройствах.

 

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

 

lenovo_2.jpg

 

Нужно в процедуре "TPlatformAndroid.HandleAndroidCmd(ACmd: Int32);" найти строки:

===============
APP_CMD_CONFIG_CHANGED:
begin
FContentRectMightHaveChanged := ContentRectChangeRefreshCount;  // <<---- !!!!
FOrientationMightHaveChanged := True;
Include(FAppCmdStates, TAndroidAppCmdState.ConfigChanged);
end;

===============

и в отмеченной строке умножить ContentRectChangeRefreshCount на 3 или 4: FContentRectMightHaveChanged := ContentRectChangeRefreshCount * 4;

 

После этой поправки и исправлений от "Magnum Labs" (см. выше) форма отображается правильно, сколько планшет не крути. На скорость работы приложения это никак не отразилось. Проверялось также на нескольких аппаратах Samsung.

 

lenovo_2c.jpg

 

Если будет интересно, в следующий раз расскажу как устранить проблему ненужного появления NavigationBar если кликнуть по TMediaPlayerControl или TWebBrowser, а также странной анимации появления/скрытия указанных компонент при изменении их свойства Visible. Проблема с NavigationBar касается устройств, у которых имеется SoftKey.

Изменено пользователем Andrew
Ссылка на комментарий
  • 0
В 24.10.2015 в 05:09, Andrew сказал:

Для устранения проблемы необходимо:
==================================
1) скопировать файл FMX.Platform.Android.pas в папку с проектом;
2) внести заменить "родную" функцию
function TWindowManager.RetrieveContentRect: TRect; на приведенную ниже и перекомпилировать проект:

 

 

Компилирую проект, получаю ошибку

[dcc32 Fatal Error] FMX.Platform.Android.pas(18): F2613 Unit 'Androidapi.Helpers' not found.

Ссылка на комментарий
  • 0

Если кто то хочет проэмулировать данную проблему, используйте эмулятор Nox. Он основан на Intel архитектуре и именно поэтому самый быстрый среди всех эмуляторов. Delphi программы на нем работают. И там та же проблема с заголовком.

Автор переименуйте пожалуйста тему на Смещается заголовок на Android Intel или что то похожее

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0
В 26.10.2015 в 06:57, Andrew сказал:

Если будет интересно, в следующий раз расскажу как устранить проблему ненужного появления NavigationBar если кликнуть по TMediaPlayerControl или TWebBrowser, а также странной анимации появления/скрытия указанных компонент при изменении их свойства Visible.

Мы все еще ждем рассказа )

Ссылка на комментарий
  • 0
В 26.03.2017 в 22:41, x11 сказал:

у меня решилась проблема

FMX.Platform.Android.pas в USES НЕ надо добавлять.

 

я ошибся - проблема не решилась :(

Изменено пользователем x11
Ссылка на комментарий
  • 0
  • Модераторы

пометите любой компонент в позицию 0;0 и запустите, если компонент не заедет под статус бар, значит позиционирование окна правильное

Ссылка на комментарий
  • 0

но там лежит же Label1 c надписью FMX.StatusBar

почему метка не отображается?

 

Теперь я на форму кинул 2 метки и верхнюю покрасил в красный цвет.

Запустил на BlueStacks.

Как видите, красная заползла под панель статуса.

7abbce5ba3c74857bb36f7faa25d6111.png

Ссылка на комментарий
  • 0
  • Модераторы
Только что, x11 сказал:

А на Андроиде (у мну 5.0.2) проблем и не было.

Я про интел устройства, этот способ проверял на интел девайсе 5+, все работало. ниже версией устройства не было

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...