• 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+, все работало. ниже версией устройства не было

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


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

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

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

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

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

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

Войти

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

Войти

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

    • От 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 на нём глючит...
    • От gutalin79
      Доброго времени суток!
      Хотел у Вас спросить. Есть ли возможность сделать на Delphi под Android кнопку которая была бы доступна в режиме блокировки? То есть чтобы я мог её нажать и включить фонарик или ещё что-нибудь и при этом не пришлось разблокировать телефон. Заранее благодарю, за ответ!  

    • От brunnengi
      Здравствуйте.
      Требуется программа на андроид с набором кнопок со следующем функционалом:
      1. Кнопка1 - создать базу в test.sqlite (в том месте где доступ к нему есть только у самого приложения (имею ввиду если это не ROOT телефон, при рут и так всё понятно)
      2. Кнопка2 - создать таблицу в базе test.sqlite с названием "TblTest01" (с разным набором полей на своё усмотрение)
      3. Кнопка3 - создать таблицу в базе test.sqlite с названием "TblTest02" (с разным набором полей на своё усмотрение)
      4. Кнопка4 - Добавить строку в таблицу "TblTest01" (любой набор данных на ваших усмотрение)
      5. Кнопка5 - Удалить строку в таблице "TblTest01" (по любому ключу на ваше усмотрение)
      6. Кнопка6 - Изменить строку в таблице "TblTest01" (по любому ключу и любое значение на ваше усмотрение)
       
      Приложение должно иметь фоновый сервис, который должен получать данные с сервера и добавлять их в базу test.sqlite в таблицу "TblTest02".
      При получение новый данных, сервис должен показать в "шторке" сообщение, по клику на которую открывается само приложение с визуальной частью.
      Т.е. если визуально приложение закрыто, выгружено, не запущено или запущено, фоновый процесс должен сам делать запросы к серверу и добавлять новые данные в базу, если они есть/поступили
      Приложение должно запускаться вместе с системой, после перезагрузки и т.д.
      Использовать только те компоненты что доступны в самой среде из коробки.
      Часть где делается запрос к серверу должен иметь timeout равный 20 секундам.
      Сервис должен грамотно делать запросы к серверу как положено в Андроид приложениях. 
      Серверная часть мне не нужна, можете для теста сами эмулирвать эти процессы.
       
       
      -----
      ЦЕНА: 2500р.
      СРОКИ: Не горит, но в целом где то дней 7 есть
      Перечисляю на QIWI, ЯД, Сбербанк, короче куда скажите.
    • От zekelive
      Добрый день, товарищи. Если кто сталкивался, подскажите) в потоке создаются картинкив виде плиток и прочие компоненты и падают на scrollbox.  Но в runtime пролистывание лагает, да в целом вся программа подлагивает. Можно ли как то реализовать подгрузка в фоне без ущерба? Или может ещё какой способ есть?
  • Последние посетители   0 пользователей онлайн

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