Перейти к содержанию
  • Регистрация
  • 0
Юрий Гусач

Размеры формы на разных устройствах

Вопрос

Доброго дня!

Проясните пожалуйста ситуацию: при запуске программы  под Андроидом на различных устройствах я получаю размеры формы, которые вроде всегда в разы меньше чем максимальное разрешение экрана конкретного устройства. Я пробовал планшеты и разные смартфоны. Написал тестовую прогу, которая выводит СlientScreen и  ClientWidth формы, на которой ничего больше нет. Например для крайне бюджетного смартфона Fly FS-549 получилось 497 х 320, а по паспорту 854x480. Разрешение и так хреновое, а Delphi его еще сильнее уменьшает. -       Почему это происходит и можно ли как то это обойти?

 

 

Изменено пользователем Юрий Гусач

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


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

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

  • 0

Это происходит из-за масштабирования.

В вашем случае, коэффициент масштабирования равен 1.5
По ширине если перемножить 320 на 1.5 как раз получится паспортные 480.
По высоте должно тоже получиться, но у вас скорее всего форма не на полный экран, поэтому сжирается честь места сверху для статусбара и снизу для кнопок назад, домой, и список приложений.
Мне доводилось работать с устройствами на которых были такие коэффициенты
1.5 - древнющий беспонтовый ACER, разрешение экрана не помню
2.0 - ветеран Nexus 4, разрешение 1280х720
3.0 - Huawei p8 lite 2007, разрешение 1920х1080

Со всеми этими устройствами дельфи работает без проблем, масштабирование не приносит сколь-нибудь значимых проблем.

45 минут назад, Юрий Гусач сказал:

можно ли как то это обойти?

Расскажите, с какой целью?

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


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

Delphi то работает без проблем. Но внешний  вид приложения хотелось бы получить немного получше. В принципе понятно, что применяется масштабирование. Не полностью понятно когда, какое, и почему?

Например на  Samsung S3 из 1280 x 720  получаем 640 x 360. то есть коэффициент 2. Почему 2, а не 3 или 1.5  ?   

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


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

Так внешний вид абсолютно нормальный получается. Нужно лишь подготовить ресурсы для каждого коэффициента, но это везде так.

Я сейчас не на рабочем месте, могу завтра показать как это выглядит на разных устройствах.

Почему два а не три - роли не играет. Этот коэффициент можно получить, если необходимо.

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


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

Так внешний вид абсолютно нормальный получается. Нужно лишь подготовить ресурсы для каждого коэффициента, но это везде так.

Я сейчас не на рабочем месте, могу завтра показать как это выглядит на разных устройствах.

Почему два а не три - роли не играет. Этот коэффициент можно получить, если необходимо.

Спасибо!

Интересно, как получить коэффициент масштабирования во время работы программы(у пользователя может быть любое устройство). 

И все-таки было бы очень интересно узнать, что именно добиваются разработчики Fire monkey под Андроидом урезанием разрешения экрана.

По видимому, какой то смысл в этом есть, но какой именно? 

  

   

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


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

Интересно, как получить коэффициент масштабирования во время работы программы(у пользователя может быть любое устройство). 

var     ScreenService: IFMXScreenService;
        scale: single;

begin
    if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
    scale:=ScreenService.GetScreenScale;
end;

 

23 минуты назад, Юрий Гусач сказал:

И все-таки было бы очень интересно узнать, что именно добиваются разработчики Fire monkey под Андроидом урезанием разрешения экрана.

По видимому, какой то смысл в этом есть, но какой именно? 

   

Эту фишку придумали не разработчики FireMonkey. Коэффициент масштаба экрана используется и в iOS, и в Android. Введен он для более удобного перевода ПО под новые экраны.

Смысл в том, что оперируя тем же логическим размером экрана, ПО автоматически отрисовывает изображение на другом физическом разрешении.

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


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

Интересно, как получить коэффициент масштабирования во время работы программы(у пользователя может быть любое устройство). 

Этот код был на этом форуме. Смотрите переменную sScale

  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
  begin
    sScreenSize := ScreenService.GetScreenSize.Round;
    sScale := ScreenService.GetScreenScale;
    DeviceInfo.diScreenLogic := FloatS(sScreenSize.x) + ' x ' + FloatS(sScreenSize.y);
    DeviceInfo.diScreenPhis := FloatS(sScreenSize.x * sScale) + ' x ' + FloatS(sScreenSize.y * sScale);
    DeviceInfo.diScreenWidth := sScreenSize.x;
    DeviceInfo.diScreenHeight := sScreenSize.y;
    DeviceInfo.diScale := sScale;
  end;

 

31 минуту назад, Юрий Гусач сказал:

И все-таки было бы очень интересно узнать, что именно добиваются разработчики Fire monkey под Андроидом урезанием разрешения экрана.

Одно из наших приложений, в архиве чуть побольше фоточек чтобы вы убедились что все действительно хорошо. Ну, заодно и критику от коллег смогу услышать))
PS. не обращайте внимания на язык, так задумано)
приложение делается для школ Германии.

SMALL_1.thumb.jpg.3ab572a648ce9abe8234b87d2cf892c0.jpg

Screens.zip

Изменено пользователем Barbanel
грамматика

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


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

Смысл в том, что оперируя тем же логическим размером экрана, ПО автоматически отрисовывает изображение на другом физическом разрешении.

Во, шикарное пояснение!!!
Я все ломал голову, как это выразить)

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


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

Этот код был на этом форуме. Смотрите переменную sScale

Ага, спасибо большое ! Нашел в форуме. Буду разбираться дальше  ?

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


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

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

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

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

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

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

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

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

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


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

    • От Дмитрий Потапов
      Задался идеей написания IPTV приложения "для себя", в котором при желании смог бы реализовать что-то необходимое и удалить то, что не нужно.
      Собственно вопрос в другом: Я написал простое приложение, которое отлавливает коды кнопок с пульта, приложение по сути самое банальное, использует OnKeyDown и OnKeyUp (чисто для теста). И по нажатию на кнопку на пульте высылает например в Memo или ListBox Информацию о нажатой кнопке (включая ее код).
      Но суть в том, что далеко не все кнопки таким образом распознаются. Для примера:
      Кнопки громкости, назад, домой, увеличение\уменьшение громкости, стрелки(влево, вправо, вверх, вниз) и центральная кнопка (по совместительству OK).
      Цифры все определяются, как одна - 0
      Кнопки, которые не определяются (не срабатывает событие, ибо если был бы неизвестен код, то думаю, в таком случае получил бы все, кроме кода кнопки), но по нажатию кнопки, которая не определяется приложением - ничего не происходит вообще.
       
      Вопрос: Есть ли возможность как-то "научить" приложение распознавать эти кнопки? (Я где-то читал, может даже и здесь, что это все так реализовано именно на уровне самого FireMonkey, будто этих кнопок вообще не существует).
      Если эта тема уже поднималась на форуме или вопрос очень просто решается - извиняюсь)
    • От Brovin Yaroslav
      Хочу поделиться с вами знаковой новостью для развития библиотеки FGX Native. Официально выпущено первое Андроид приложение в Google Play Market. 
      Это приложение разработано Станиславом(@sinuke) для учащихся лицея по специальности "Почтовая связь". Оно одновременно является и полным конспектом, который всегда под рукой, и системой проверки своих знаний.
      Полностью разработано на Delphi и стандартных компонентах альфа версии FGX Native 0.9.7.0 в Delphi 10.3 Community Edition. Быстрые списки, гибкая разметка, продвинутая навигация, анимации переходов, поддержка тем и многое другое. Это лишь малая часть того, что было задействовано из текущих возможностей библиотеки.
      Приложение опубликовано в Google Play Market. Вы можете уже прямо сейчас скачать и протестировать приложение самостоятельно, загрузив его по ссылке (https://play.google.com/store/apps/details?id=com.sinukeapps.post).
      Оставляйте свои комментарии и предложения. Они помогут сделать приложение лучше, а FGX Native еще удобнее и стабильнее.
      Релиз первого приложения с использование библиотеки FGX Native - это результат огромной работы, проделанной за эти годы. В тоже время, это сигнал того, что библиотека обладает достаточным минимумом для создания типовых Андроид приложений.
      Ну, и пожалуй самое приятное, это то, что библиотека готова к бета тестированию, которое откроется в ближайшее время.  О начале закрытого бета тестирования будет сообщено позже.
      Отдельное спасибо участникам закрытого альфа тестирования за поддержку, тестирование и идеи по улучшению библиотеки. В настоящее время участниками тестирования ведутся и другие интересные проекты на базе FGX Native, о которых я расскажу позже.
      Следите за новостями.
      Приложение: https://play.google.com/store/apps/details?id=com.sinukeapps.post Автор: Станислав Игнатович @sinuke Минимальные системные требования: Android 5.0 и arm v7         
    • От Yarpda
      В серьезных приложениях (Сбербанк-онлайн или Ютюб и т.п.) когда выходят обновления с новыми функциими, они запускают своеобразный интерактивный ролик. Когда экран затемняется и остается не затемненным только новый элемент экрана например, а на затемненном фоне описывается что делает этот новый элемент.Потом все это плавно переходит к другому элементу и т.д. Выглядит все довольно красиво.
      Задался вопросом, как сделать что-то подобное под FMX. Для себя не нахожу никаких очевидных решений.
      Подскажите если кто знает, направления решения этой задачи?
      Заранее спасибо.
    • От RADStudioDeveloper
      Привет всем!
      Есть необходимость в проекте для Android Delphi FMX (RAD Studio 10.2.3 Tokyo / RAD Studio 10.3.1 Rio ) сохранять изображения с фотокамеры смартфона Android через WiFi соединение в удалённую базу данных Microsoft SQL сервера в поле BLOB.
       
      Подскажите, пожалуйста,  возможные решения, примеры Delphi кода и требуемые компоненты для работы с камерой и SQL сервером через WiFi на Android устройствах.
    • От Евгений Корепов
      Простое приложение для андроид - форма, на ней TWebBrowser. В WebBrowser открываем что то требующее разрешение на геолокацию. У примеру https://www.openstreetmap.org 
      В обычном браузере, при тыке на "Показать мое местоположение" появится popup окно с запросом разрешения на "Доступ к данным о вашем местоположении".
      Но в Delphi приложении описанном выше никакого запроса не приходит. ?
      Нашел решение для java https://forums.fusetools.com/t/geolocation-not-enabled-in-webview-on-android/1374 
      В функцию создания WebView 
      public static Object CreateWebView321(final boolean zoomEnabled,final boolean scrollEnabled) { ScrollableWebView wv = new ScrollableWebView(com.fuse.Activity.getRootActivity()); wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setUseWideViewPort(true); //enabled viewport meta tag wv.getSettings().setLoadWithOverviewMode(true); //mimic iOS Safari and Android Chrome wv.getSettings().setSupportZoom(zoomEnabled); wv.getSettings().setBuiltInZoomControls(zoomEnabled); wv.getSettings().setDomStorageEnabled(true); wv.setAllowScroll(scrollEnabled); return wv; } рекомендуется добавить следующий код
      wv.getSettings().setGeolocationEnabled(true); wv.setWebChromeClient(new WebChromeClient(){ @Override public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) { callback.invoke(origin, true, false); } }); В модуле FMX.WebBrowser.Android.pas это выглядит так
      constructor TAndroidWebBrowserService.Create; var LayoutParams: JRelativeLayout_LayoutParams; begin FWebView := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FWebView.getSettings.setJavaScriptEnabled(True); FListener := TWebBrowserListener.Create(Self); FWebView.SetWebViewListener(FListener); FFocusChangeListener := TFocusChangeListener.Create(Self); FWebView.setOnFocusChangeListener(FFocusChangeListener); FWebView.getSettings.setGeolocationEnabled(True); FWebView.getSettings.setAppCacheEnabled(True); FWebView.getSettings.setDatabaseEnabled(True); FWebView.getSettings.setDomStorageEnabled(True); FWebView.getSettings.setBuiltInZoomControls(True); FWebView.getSettings.setDisplayZoomControls(False); FWebViewContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); FChildrenContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FWebView, LayoutParams); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FChildrenContainer, LayoutParams); SetEnableCaching(True); end; Вот суть вопроса - добавить delphi код. Пробую что то вот такое, но закончить ума не хватает
      constructor TAndroidWebBrowserService.Create; var LayoutParams: JRelativeLayout_LayoutParams; begin FWebView := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FWebView.getSettings.setJavaScriptEnabled(True); FListener := TWebBrowserListener.Create(Self); FWebView.SetWebViewListener(FListener); FFocusChangeListener := TFocusChangeListener.Create(Self); FWebView.setOnFocusChangeListener(FFocusChangeListener); FWebView.getSettings.setGeolocationEnabled(True); FWebView.setWebChromeClient( TJWebChromeClient.Create.onGeolocationPermissionsShowPrompt( origin: JString; callback: JGeolocationPermissions_Callback);..... FWebView.getSettings.setAppCacheEnabled(True); FWebView.getSettings.setDatabaseEnabled(True); FWebView.getSettings.setDomStorageEnabled(True); FWebView.getSettings.setBuiltInZoomControls(True); FWebView.getSettings.setDisplayZoomControls(False); FWebViewContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); FChildrenContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FWebView, LayoutParams); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FChildrenContainer, LayoutParams); SetEnableCaching(True); end;  
    • От yooSee
      Всем привет, вот и я решил внести свою лепту в жизнь форума и сегодня мы разберемся с разрешениями на Delphi Rio под Андроид. 
      Для примера мы будем использовать разрешения на чтение и запись с памяти устройства, для начала в нашем проекте выставим в Delphi>Project>Application>Uses Permissions галочки на Read External Storage и Write External Storage.
      в uses проекта добавьте следующее
      uses System.Permissions, Androidapi.Jni.Os, Androidapi.Helpers, далее  создадим переменные
      var Form: TForm; .... FPermissionWrite: string; FPermissionRead: string; в Form.Create добавим следующий код
      procedure TForm.FormCreate(Sender: TObject); begin FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); //Значение на запись FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); //Значение на чтение end; и теперь сам не посредственно запрос на подтверждение наших прав
      procedure TForm.Button1Click(Sender: TObject); begin PermissionsService.RequestPermissions ([FPermissionWrite, FPermissionRead], nil); end; //это вызовет окно с запросом разрешения прав ну и для проверки бросим на форму TMemo и пару TButton , в них реализуем сохранение и чтение из файла с памяти устройства
      procedure TForm.Button1Click(Sender: TObject); begin Memo1.Lines.LoadFromFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; procedure TForm.Button2Click(Sender: TObject); begin Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; P.S. Напоминаю что для работы TPath нам понадобится подключить в Uses 
      uses System.system.ioutils; Надеюсь материал будет полезен! 
       
       
       

      video_2019-02-08_00-11-36.mp4 Permissions.zip
    • От brunnengi
      Здравствуйте.
      Как отключить клавиатуру, что бы она не вылетала при получении фокуса в полях ввода?
    • От Mohamed BEN AMMAR
      hello 
      i'm using delphi fmx for building android App
      i have this code for Activating The WI-FI icon from android device:
      This could be found here .
      =========== code ==================
      uses
        Androidapi.Helpers,
        Androidapi.JNI.JavaTypes,
        Androidapi.JNI.GraphicsContentViewText,
        Androidapi.JNIBridge,
        Androidapi.JNI.WifiManager;
        procedure SetWifiEnabled (AEnable: Boolean); var   Obj: JObject;   WifiManager: JWifiManager; begin   Obj: = SharedActivityContext.getSystemService (TJContext.JavaClass.WIFI_SERVICE);   if Obj = nil then     Exit;     WifiManager: = TJWifiManager.Wrap ((Obj as ILocalObject) .GetObjectID);   WifiManager.setWifiEnabled (AEnable); end; 
       
       My question is About Activating Android location:
        Is it possible to activate the service location icon from android device
       programatically without using the Location or TLocationSensor component ....?
      however I know exactly that google has been Deactivate this API since android "4" just for security reasons .....
      but i have seen many apps in playstore can activate the service without using 
      this code here ask the user for activate the location manually .... procedure TForm1.GPSSettings; {$IFDEF ANDROID} var Intent: JIntent; {$ENDIF} begin {$IFDEF ANDROID} Intent := TJIntent.Create; Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_LOCATION_SOURCE_SETTINGS); TAndroidHelper.Activity.startActivity(Intent); {$ENDIF} end; in other versions like lolipopup can show just the Allow Permission system dialog timer ....( Asking the user for Allowing this App to Activate the service location ......) 
      I have an android device with lolipopup version and i try to execute the location EMBARCADERO sample but 
      this one can not activate the service location ICON even  my device show me the Allow permission dialog where i choose yes allow
      with never ASK....
      Finally ,  I like the WI-FI code above .....
      and i'm wondering if someone here can do this task for me (i need a unit as the WI-FI code above which can offer me
      the option to activate the Service Location ICON )
      I'm ready to paid for that task .....
       
      Sincerelly: Brave.
    • От GMX
      Android 6 MIUI
       ни стандартные примеры не работают, ни попытки что-то свое создать... 
      LastDiscoveredDevices - всегда 0, хотя из настроек устройства находятся. 
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Bluetooth, System.Bluetooth.Components, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Bluetooth1: TBluetooth; Label1: TLabel; AniIndicator1: TAniIndicator; procedure Button1Click(Sender: TObject); procedure Bluetooth1DiscoverableEnd(const Sender: TObject); procedure Bluetooth1DiscoveryEnd(const Sender: TObject; const ADeviceList: TBluetoothDeviceList); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Bluetooth1DiscoverableEnd(const Sender: TObject); begin Label1.Text := IntToStr(Bluetooth1.LastDiscoveredDevices.Count); end; procedure TForm1.Bluetooth1DiscoveryEnd(const Sender: TObject; const ADeviceList: TBluetoothDeviceList); begin Label1.Text := IntToStr(ADeviceList.Count); AniIndicator1.Enabled :=False; end; procedure TForm1.Button1Click(Sender: TObject); begin Bluetooth1.DiscoverDevices(10000); AniIndicator1.Enabled :=True; end; procedure TForm1.FormCreate(Sender: TObject); begin while not Bluetooth1.Enabled do Bluetooth1.Enabled := True; end; end. В разрешениях bluetooth, bluetooth admin, coarse location, fine location включены... 
    • От Barbanel
      Всем привет!
      Поясните мне плиз, такую вещь как TTouchAnimation, на примере Android.
      Как я это понимаю:
      Есть к примеру некая кнопка, которая имеет несколько состояний, из которых важны: не нажатая и нажатая.
      В момент нажатия, TTouchAnimation пускает расходящийся круг, причем четко из центра нажатия.
      Ок, пусть на самом деле не круг, а картинку, указанную в... собсно, где???
      Как задать эту область, которая должна отображаться как реакция на нажатие?В редакторе среды, у объектов TButtonStyleObject есть свойство TouchAnimation: (TTouchAnimationAdapter), у которого в свою очередь есть свойство Link: (TBitmapLinks), которое как я считал и отвечает за эту область.
      Однако, при клике на это поле ничего не происходит.
      Баг среды, или моя удача???
      Как вы с этим боретесь?
      Других полей, где могли бы быть эти координаты я не нахожу.
      Заранее спасибо!

  • Последние посетители   0 пользователей онлайн

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

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