• 0
Andrew

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

Вопросы

Для проведения опытов на 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 ответов на этот вопрос

  • 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

а сам файл FMX.Platform.Android.pas в USES надо добавлять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

Изменено пользователем ENRGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

запустил

Screenshot_3.png

 

Тормозит, конечно, при изменении цвета ужасно.

Изменено пользователем x11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Ну тут не это важно на счёт цвета, главное позиционирование окна правильное?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ииии

а где заголовок? или его не должно быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

 

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

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

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

7abbce5ba3c74857bb36f7faa25d6111.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, x11 сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Юрий Гусач
      Доброго дня!
      Проясните пожалуйста ситуацию: при запуске программы  под Андроидом на различных устройствах я получаю размеры формы, которые вроде всегда в разы меньше чем максимальное разрешение экрана конкретного устройства. Я пробовал планшеты и разные смартфоны. Написал тестовую прогу, которая выводит СlientScreen и  ClientWidth формы, на которой ничего больше нет. Например для крайне бюджетного смартфона Fly FS-549 получилось 497 х 320, а по паспорту 854x480. Разрешение и так хреновое, а Delphi его еще сильнее уменьшает. -       Почему это происходит и можно ли как то это обойти?
       
       
    • От Андрей Лещинский
      Здравствуйте ребята. С Firemonkey знаком только два дня. Многое уже подчеркнул с данного форума. Спасибо вам. 
      Проблема заключается в том, что у меня sdk для андроид 7 версии. Я собираю apk файл, запускаю его на Андроид 7 и все отлично, но как только я устанавливаю приложение на Андроид например версии 5, то при запуске оно мерцает пару раз и потом отображается отлично. Не подскажите в чем проблема? Я пробовал проект с данного форума, чтобы форма уходила под статусбара. Вот все они и мерцают на Андроид ниже 7, другие не пробовал проекты
      Стаж у меня только 2 дня, скажите в какую сторону смотреть мне далее
    • От gutalin79
      Почему при добавлении MapView в пример Android Service, приложение перестает работать?
      AndroidSimpleService.zip
       
       
       
      Пример делал по этому видео: 
       
    • От Astghik
      Hello !!!
      I want onButtonClick create popup. I use TPopup component. All good, but on android "Back button" click closing forma. But I want close popup (when popup is shown).

       
      //---------------------------------------------------------------------------------
      void __fastcall  btn3PointsClick(TObject *Sender)
      {
          PopUpSettings->IsOpen = true;
          PopUpSettings->PlacementTarget = btn3Points;
          PopUpSettings->BringToFront();
      }
      //-------------------------------------------------------------------------------------
      void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose)
      {
          try {
              if (PopUpSettings->IsOpen == true) {
                  CanClose = false;
              }
              else {
                  CanClose = true;
              }
          } __finally {
              PopUpSettings->IsOpen = false;
          }
      }
      //-------------------------------------------------------------------
       
    • От Rokweb
      Таймер с интервалом 1мс заметно подтормаживает во время выполнения анимации TFloatAnimation в Tokyo. У всех так или только у меня?
    • От Rokweb
      Здравствуйте.
      Речь пойдёт об Android.
      Использовал в Berlin данный unit для проигрывания звуков (TMediaPlayer не подходит) и все отлично работало. Сейчас перешел на Tokyo и происходит зависание в цикле:
       
      while not GLoaded do begin Sleep(10); Application.ProcessMessages; end;  
      Модуль прикрепил в сообщении.
       
      Так же интересует - возможно ли, использовать стиль, созданный в процессе разработки Android приложения - в iOS и если да - то как это правильно реализовать (почти каждый контрол имеет сейчас свой стиль)?
       
      Прошу помощи.
      GameAudioManager.zip
    • От zekelive
      Товарищи, здравствуйте. Хотел бы проконсультироваться с вами на довольно сложно для меня тему. Имеется клиентское мобильное приложение на Андроид. Принцип его просто, загружает фирмы из БД в scrollbox. За счёт того, что сразу загрузка всех данных из сервера занимает длительное время, было принято решение загружать с сервера только ключевую информацию (название фирмы), а остальную информацию загружать из локальной БД. При этом, т.к. файл БД можно легко вытащить из apk файла любому человеку, размещать всю БД на локалке нельзя. Только информацию в целом не представляющую большой значимости в отдельности от названия фирмы и не только. 
      Вопрос, правильная ли схему построения была выбрана с точки зрения защиты данных (если это так можно назвать), и оптимизации загрузки информации. 
      Приветствуются ваши советы, как лучше построить схему взаимодействия приложения с БД, или как лучше защитить данные. В идеале для быстродействия, загнать побольше данных в локальную БД. 
    • От Edward Tarasov
      Привет всем. кто сталкивался с такой ерундой, что в webbrowser вместо сайта тупо белый экран?? причем сам сайт отображаеться норм, и на том же планшете, но в стандартном бразуере и на компе... и именно этот сайт не пашет из приложения
    • От zekelive
      Друзья, первый раз столкнулся с картами и не пойму в чем дело. Приложение подписано, релизная версия. Добавил карты на форму и запустил на компиляцию, все отлично. Запускаю на смартфоне - приложение сразу вылетает. Ничего не прописывал связанное с картами, просто добавил компонент на форму. Что не так ?
    • От Алексей Алексеев
      Здравствуйте! Помогите начинающему, всё перелазил, всё что мог и всё безрезультатно.
      Такая проблема: 
      Стоит задача убрать перенос строки в Memo:
      Из 
      "1строка"
      "2строка" 
      сделать:
      "1строка 2строка" .
      Казалось бы все просто:
      memo1.Text:=memo1.Text.Replace(#13#10,' '); И на Windows всё работает, но на Android отказывается!
      Просто не реагирует, ошибок не выдает. Проверял на XE8 и на 10.2.
      Может дело в смартфоне Xiomi miMax? Так как вообще memo на нём глючит...
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу