• 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
Вячеслав, krapotkin, Rusland и 2 другим понравилось это

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


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

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

ENERGY понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
В 26.03.2017 в 22:41, x11 сказал:

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

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

 

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

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

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


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

странно, ошибка через раз проявляется

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


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

запустил

Screenshot_3.png

 

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

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

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


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

ииии

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

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


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

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

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


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

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

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

 

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

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

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

7abbce5ba3c74857bb36f7faa25d6111.png

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


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

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

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


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

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

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

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Rusland
      Приложение свернуто или закрыто.
      Отправляю один пуш, на телефоне в шторке появляется уведомление.
      Отправляю еще один, появляется второе уведомление и так далее. Сколько пушей, столько и уведомлений.
      Как сделать чтобы все уведомления собирались в одном уведомлении в шторке? (как делают telegram, whatsapp и т. п.)
    • Автор: Astghik
      How to print text from Android (IOS) device ? (C++ Rad Studio 10.2)
      With USB printer and other types printers (WiFi, Bluetooth ....)
    • Автор: Rionn
      В этой ссылке показан пример работы в одной сети (написано курсивом). Не могу найти, чтобы PC работал по сети или по WiFi, а телефон по мобильным данным. Не подскажете?
    • Автор: Евгений Корепов
      Наткнулся тут на изящную штуку для приложения с PUSH уведомлениями на Android и Ios. Один объект, все сам делает.
      Внедрил в одно боевое приложение с 100+ тысячами установок, полет нормальный.
      Описание тут https://delphiworlds.com/2017/04/firebase-cloud-messaging-android-ios/
      Исходный код с примером на гитхабе https://github.com/DelphiWorlds/PushClient
      Использование максимально простое:
      uses DW.PushClient; .... private FPushClient: TPushClient; procedure PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); procedure PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); .... procedure TFormMain.InitPushService; begin FPushClient := TPushClient.Create; FPushClient.GCMAppID := ConstGCMAppID; FPushClient.ServerKey := ''; FPushClient.BundleID := ''; FPushClient.UseSandbox := Debug; // Change this to False for production use! FPushClient.OnChange := PushClientChangeHandler; FPushClient.OnReceiveNotification := PushClientReceiveNotificationHandler; try FPushClient.Active := True; except SendError('FPushClient.Active Exception'); end; end; procedure TFormMain.PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); begin if TPushService.TChange.DeviceToken in AChange then begin HDevicePushParams.DeviceID:=FPushClient.DeviceID; HDevicePushParams.DeviceToken:=FPushClient.DeviceToken; GetHTTP(CommandRegisterFCM); // Memo1.Lines.Add('DeviceID = ' + FPushClient.DeviceID); // Memo1.Lines.Add('DeviceToken = ' + FPushClient.DeviceToken); end; end; procedure TFormMain.PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); begin // ShowMessage(ANotification.DataObject.ToString... end; Правда руки не дошли разобраться для чего ему 
        FPushClient.ServerKey := '';
        FPushClient.BundleID := '';
      Но и без этого работает.
       
    • Автор: Golovanyuk
      Здравствуйте!
      У меня проблемы при создании Android программ.
      Когда компилирую проект и запускаю его из среды Delphi сразу на мобильник, то первый раз программа еще работает, а во второй-третий раз на мобильнике показывается только заставка с огнем, а потом черный экран, а в самой среде в самом низу (где Event log и где обычно показываются процессы) - ничего нет, пусто.
      Потом приходится перезапускать Delphi.
      У меня есть подозрения, что я неправильно настроил Delphi.
      Не могли бы гуру взглянуть на мои настройки и указать на мои ошибки?
      Скриншоты приложил, спасибо.
      P,S, Delphi 10.1



    • Автор: delphiex
      Всем доброго дня. Прошу помочь, любая малейшая подсказка прояснит ситуацию. Сделал русскоязычное Андроид приложение на Delphi XE8.  Использовал SQlite в своем проекте. Работает отлично, оттестировал на Android 6.0 и  Android 4.5 на двух разных аппаратах. Прежде чем делать мультиязычное приложение, решил проверить как оно будет работать, если язык системы будет отличным от русского. Поставил английский-United Kingdom и приложение не запустилось, вернее пошла заставка, после нее  приложение просто закрылось без ошибок. То же самое при французском, испанском системных языках. А вот при немецком и украинском языке системы - работает. В чем здесь дело никак не могу понять и куда копать. Приложение не могу предоставить - слишком большое.
    • Автор: Алмаз Амангельды
      Multi device application 
      Работаю  с WebBrowser и появляется такая проблема что компонент дублируется появляется тоненькая полоска (пикселей 10 или 5 ) которая работает отдельно (т.е можно скролить страницу в разные направления ,  поэтому складывается впечатление что данный компонент Дублируется )
      Вверху tabcontrol к нему добавлен Эффект shadow внизу
      twebBrowser  Align =Client 
      И все эти компоненты лежат на panel 
      Align =client 
       
      Тестирую на экране 5.5
      Естественно вопрос что произошло и как это исправить 
    • Автор: ENERGY
      Как залить с Delphi Android в базу MySql строки, я примерно понял - составляем GET запрос и вставляем строки в параметры, затем считываем их в PHP скрипте и в базу.
      А вот как быть с картинкой. Как добавить картинку через PHP скрипт из программы на Android?
      POST запрос? Кто нибудь делал такое уже?
      Спасибо 
       
      P.s. На данный момент FireDAC не поддерживает работу с MySQL из под Android. Пока только SQLite и  InterBase ToGo. Даже если в будущем будет поддерживать, многие на этом форуме рекомендуют не использовать прямое подключение к базам из под мобильных систем, а использовать прямые GET запросы к примеру к PHP скриптам. Это связано с нестабильностью интернета т.к. так интернет может часто переключаться (от вышки к вышке) и менять параметры подключения. 
    • Автор: Макс Войтенко
      я знаю что можно добавить внешний файл в программу по пути (assets\internal)(скриншот) (раньше получали к нему доступ через)
      loadfromfille(GetDocumentsPath()+"test.txt")
      Сейчас GetDocumentsPath убрали из RadStudio и походу заменили чем то.
      я использовал в свой программе директорию 
      loadfromfille(GetHomePath()+"test.txt"), но я не знаю куда мне добавить программу через deploymant (скриншот)
      Тоесть
      1)GetDocumentsPath = (assets\internal) 
      2)GetHomePath= ??????
      3)GetDocumentsPath убрали из radstudio.
      Какую мне прописать директорию чтоб я имел к ней доступ через GetHomePath()??

    • Автор: Алмаз Амангельды
      Привет всем! 
      Кодить начал на андроид совсем недавно возникают некие проблемы и спорные вопросы, и перейду сразу к вопросу как пользоваться BoringSSL под Андроид 6 и ниже, возможно ли использовать BoringSSL  на андроидах ниже 6, и как реализовать сие чудо!
      З.Ы если есть возможность опишите по подробнее...
      (дело в том что я хочу спрарсить парочку постов с паблика VK)
       
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу