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

Brovin Yaroslav

Администраторы
  • Постов

    2 124
  • Зарегистрирован

  • Посещение

  • Победитель дней

    390

Сообщения, опубликованные Brovin Yaroslav

  1. А, всё, разобрался. Это просто надо менять стили.

     

    Не до конца разобрались.

     

    TListBoxItem - это обычные контролы, поэтому они так же допускают вставку других контролов друг в друга. Поэтому, чтобы добавить надпись сбоку, достаточно поместить TLabel внутрь итема, выровнить по правому краю и задать правы отступ (Margins.Right = 10). Так же для такой метки в FireMonkey предусмотрен специальный стиль "listboxitemdetaillabel". 

     

    Обратите внимание, что таким образом можно разместить любой контрол.

     

    Здесь следует четко разделить два подхода:

    1. Стилизация итемов. Если у нас лист бокс содержит большое число итемов, то лучше использовать подход с созданием отдельного стиля. Поскольку при прокрутке итемов TListBox выгружает стили для итемов, которые не видны на экране и тем самым экономит память. Однако, для большого числа итемов лучше использовать TListView, так как он адаптирован и оптимизирован для работы с большим количеством итемов. В то время, как TListBox рассчитан для создания небольших меню
    2. Непосредственное создание дополнительных контролов в итеме. Этот подход удобен в своем использовании и рекомендуется для варианта использования TListBox, как небольшое меню приложения.

    Например у меня по такому рецепту получился вот такой вариант:

    post-1-0-60343100-1390776666_thumb.jpgpost-1-0-68859800-1390777363_thumb.jpg

  2. Тогда нужно сделать свой стиль в TStyleBook и задать его для этого итема.

    1. Кидаем на форму TListBox и создаем итемы. Для разделения групп настроек вставляем TListBoxGroupHeader. У меня получился такой вариант:

    post-1-0-92777200-1390775791.jpg

    2. Кидаем на форму TStyleBook и открываем редактор стиля, двойным кликом на TStyleBook.

    3. Перетаскиваем TLayout к корню стиля в Structure и задаем название стиля как "listboxgroupheader".

    post-1-0-47660900-1390775792_thumb.jpg

    4. Подключаем стиль бук в дизайнере к форме Form.StyleBook = StyleBook и задаем произвольную высоту для разделителей групп итемов.

    post-1-0-45278500-1390775791_thumb.jpg

     

    P.S. Если хотите оставить текст на разделителях, то нужно в стиль добавить контрол для вывода текст (TText или TLabel) с название стиля "text"

    1. О том, почему некоторые контролы имеют фиксированный размер написано тут: Почему для некоторых контролов нельзя поменять высоту или ширину?
    2. О том, как снять это ограничение (но не рекомендуется) написано тут: Как снять запрет изменения размера контролов
  3. В FireMonkey TListBox поддерживает несколько готовых вариантов итемов:

    1. TListBoxItem - обычный итем
    2. TListBoxHeader - общий заголовок лист бокса.
    3. TSearchBox - итем с полем поиска элементов по фильтру.
    4. TListBoxGroupHeader - заголовок группы итемов (Его можно использовать, как разделитель групп, предварительно убрав текст Text = "")
    5. TListBoxGroupFooter - подвал данных под группой итемов.

    Подробное руководство о том, как создавать из TListBox любой вариант UITableView очень детально описано тут: Mobile Tutorial: Using ListBox Components to Display a Table View (iOS and Android)

     

  4. Для мобильных устройств FireMonkey поддерживает все стандартные типы виртуальной клавиатуры (обычная, цифровая, ввод электронных адресов). Задание типа клавиатуры осуществляется через свойство: TEdit.KeyboardType. (Описание)

     

    Когда вы указываете TEdit, что он будет использовать цифровую клавиатуру, то в момент начала ввода в TEdit (установка фокуса в TEdit), появится клавиатура, выбранного типа.

     

     

  5. Ответ на этот вопрос дан здесь: [Android] Не получается увеличить высоту TProgressBar 

     

    По умолчанию каждая платформа определяет свои правила построения пользовательского интерфейса. Это выражается, например, в том, что в ios и в Андроиде прогресс бар должен быть фиксированной высоты. Чтобы не нарушать руководство по проектированию пользовательских интерфейсов каждой платформы, FireMonkey принудительно запрещает менять размеры некоторых контролов. 

     

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

     

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

  6. Приложения FireMonkey для Андроида полностью совместимы с версиями Андроид, начиная с версии 2.3 (GingerBread). Поэтому приложение, собранное с последней версии Android SDK, будет успешно работать и на всех предыдущих версия до 2.3 включительно.

     

    Однако, если вы хотите поменять используемую для сборки версию Андроид SDK, это можно сделать в настройках SDK профиля.

     

    1. Меню->Tools->SDK Manager (слева в дереве)
    2. Выбираем профиль SDK для андроида и в самом низу в поле SDK API-Level Location меняем путь на путь к другой версии SDK. (смотрите прикрепленный скриншот)

    post-1-0-44863900-1390477936_thumb.jpg

  7. TLabel имеет стандартный механизм автоматического вычисления размеров метки на основании текста и параметров.

     

    Чтобы заставить Label автоматически менять ширину с учетом переносов, достаточно:

    Label1.AutoSize := True;
    Label1.WordWrap := True;
    

    Ниже приведены результаты работы этого способа при изменении ширины формы и автоматически выравненной меткой по верхнему краю Align := TAlignLayout.alTop;

    post-1-0-09107500-1390236139.jpgpost-1-0-25146600-1390236139_thumb.jpg

  8. Собственно как вставить видео c YouTube например в Item ListBox'a?

     

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

     

    Нужно понимать следующее:

    1. Видео - это файл, который либо непосредственно воспроизводится в проигрывателе, например, в компоненте TMediaPlayer, либо отправляется по сети в виде потока. Опять же в проигрыватель. Поэтому "вставить видео" уже странно.
    2. YouTube - это веб сервис, который позволяет пользователям просматривать видео файлы, располагаемые на серверах Гугла. Я не знаю способ доставки видео, это может быть как и потоковая передача файла целиком, или же передача только по кадрам.
    3. Видео не встраивают и не вставляют. Встраивают видео проигрыватель, который уже воспроизводит файл.

    На основании этого уже о вашей задаче:

     

    Вы показываете в лист боксе картинку TImage, в котором отображаете скриншот видео плеера или же кадр видео. Затем по нажатию на картинку, вы либо открываете видео плеер и воспроизводите соответственный видео файл. Либо встраиваете проигрыватель прямо в лист бокс и там же опять же воспроизводите видео.

     

    Ответы на вопросы использования сервиса YouTube для получения видео файлов нужно искать на сайте YouTube в разделе для разработчиков.

     

    P.S. Просьба, подробнее расписывать ваш вопрос, прикладывать скриншоты для демонстрации достигаемого результата.

  9. Как сделать чтобы при нажатии на кнопку в Safari открывался сайт?

     

    1. Стандартный браузер определяет сам пользователь в системе, поэтому это не обязательно будет Safari.
    2. Обязательно указывайте платформу на которой нужно достичь данного действия.
  10. Русский
    За управление виртуальной клавиатурой в FireMonkey отвечает сервис IFMXVirtualKeyboardService (Embarcadero Doc Wiki). Который позволяет отображать и скрывать клавиатуру.
    Для скрытия клавиатуры достаточно выполнить следующий код:

    uses
      FMX.Platform, FMX.VirtualKeyboard;
    
    procedure TForm5.ButtonHideKeybordClick(Sender: TObject);
    var
      KeyboardService: IFMXVirtualKeyboardService;
    begin
      // Запрашиваем сервис виртуальной клавиатуры
      if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
        KeyboardService.HideVirtualKeyboard;
    end;
    

    Чтобы показать клавиатуру для контрола:

    procedure TForm5.ButtonShowKeyboardClick(Sender: TObject);
    var
      KeyboardService: IFMXVirtualKeyboardService;
    begin
      // Запрашиваем сервис виртуальной клавиатуры
      if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
        KeyboardService.ShowVirtualKeyboard(Edit1);
    end;



    English 
    FireMonkey has special service for managing Virtual Keyboard. It is IFMXVirtualKeyboardService (Embarcadero Doc Wiki). It allows show and hide keyboard.
    For showing virtual keyboard use next code:

    uses
      FMX.Platform, FMX.VirtualKeyboard;
    
    procedure TForm5.ButtonHideKeybordClick(Sender: TObject);
    var
      KeyboardService: IFMXVirtualKeyboardService;
    begin
      // Request service of visrtual keyboard
      if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
        KeyboardService.HideVirtualKeyboard;
    end;
    

    For showing virtual keyboard for control:

    procedure TForm5.ButtonShowKeyboardClick(Sender: TObject);
    var
      KeyboardService: IFMXVirtualKeyboardService;
    begin
      // Request service of visrtual keyboard
      if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then
        KeyboardService.ShowVirtualKeyboard(Edit1);
    end;
    
  11. Из предполагаемых вариантов действий для устранения ошибки:

     

    Четко указать системе тип данных "text/html", тем самым выявив наше намерение, что нужно отправить запрос программе, которая умеет обрабатывать данные именно этого типа.

    OpenLinkIntent.setType(StringToJString('text/html'));
    

    Еще советуют убрать один слэш из трех после "file:"

     

    Или попробовать варианты, которые есть на StackOverflow: http://stackoverflow.com/questions/7009452/how-to-launch-browser-to-open-local-file

  12. Открытие ссылки под Андроид: 

    uses
      FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText;
    
    function OpenURL(const AUrl: string): Boolean;
    var
      Uri: Jnet_Uri;
      OpenLinkIntent: JIntent;
    begin
      Uri := StrToJURI(AUrl);
      // Формируем намерение об открытии ссылки Uri в стандартном браузере
      OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);
      // Устанавливаем тип данных
      OpenLinkIntent.setType(StringToJString('text/html'));
      // Задаем категорию активити, который будет открывать нашу страницу.
      OpenLinkIntent.addCategory(TJIntent.JavaClass.CATEGORY_BROWSABLE);
      // Запускаем приложение и передаем ему наше намерение
      SharedActivity.startActivity(OpenLinkIntent);
    end;
    
    А чтобы открыть файл, нужно сформировать урл AUrl в виде: "file:/ //tmp/android.txt" (убрать пробелы) Согласно принятому стандарту оформления ссылок.
  13. Процесс добавления итема дорогостоящая операция. Так как после добавления итема идет операция выравнивания контента. И так происходит с каждым новым добавляемым TListBoxItem.

     

    Однако, у каждого контрола есть два метода, которые позволяют избежать лишних вызовов и ускорить процесс добавления дочерних объектов - TControl.BeginUpdate и TControl.EndUpdate.

     

    Решение простое, перед тем, как добавлять итем в листбокс, нужно вызывать метод BeginUpdate. А по окончании добавления всех итемов - EndUpdate.

    var
      I: Integer;
      ListItem: TListBoxItem;
    begin
      ListBox1.BeginUpdate;
      try
        for I := 0 to 1000 do
        begin
          ListItem := TListBoxItem.Create(Self);
          ListItem.Parent := ListBox1;
          ListItem.Text := I.ToString;
        end;
      finally
        ListBox1.EndUpdate;
      end;
    end;
    
  14. По умолчанию, каждая платформа определяет свои правила оформления пользовательского интерфейса, согласно Руководству пользовательского интерфейса Андроида TProgressBar не может быть по высоте другого размера. Поэтому стиль андроид платформы в Firemonkey запрещает изменять высоту некоторых контролов, в том числе TProgressBar. Аналогичная ситуация в Eclipse для андроида. Там также нельзя менять для этого компонента его высоту.

     

    Фиксация размера происходит путем сохранения в стиле свойств FixedHeight  и FixedWidth (не доступного в дизайнере). Если эти свойства больше 0, значит контрол будет иметь фиксированный размер.

     

    Решение

    Если вы вдруг захотели нарушить стандарты, рекомендованные Google по оформлению UI, вы можете сделать следующее:

    1. Открыть BitmapStyleDesigner (находится в папке bin студии bin\BitmapStyleDesigner.exe)

     

    2. В выпадающем списке первой кнопки на панели инструментов Создать новый стиль (светлый или темный) для платформы андроид. Редактор автоматически создаст вам стандартный стиль для андроида.

    post-1-0-39079200-1389973679_thumb.jpg

     

    3. Сохранить стиль для Firemonkey. В диалоге сохранения выбрать тип файла "FireMonkey Style (*.style)"

    post-1-0-88983200-1389973927.jpg

     

    4. Открыть сохраненный файл стиля в текстовом редакторе и найти в нем стиль TProgressBar - "progressbarstyle".

    post-1-0-78011200-1389974022.jpg

     

    5. Удалить из стиля строчку:

    FixedHeight = 10
    

    6. Сохранить стиль и загрузить файл стиля в TStyleBook.

    post-1-0-67130300-1389974141.jpg

     

    Теперь для TProgressBar можно менять высоту. Однако, учтите, что стили для Андроид и iOS растровые. Это значит, что при растровое исходное изображение прогресс бара рассчитано на высоту в 10 пикселей и при увеличении высоты, вы потеряете качество отрисовки прогресс бара (смотрите рисунок выше).

  15. Добрый вечер
     
    Не получается увеличить высоту TProgressBar в Delphi XE5 при разработке под Android, однако при создании приложения для Windows все изменяется.
    1. Так и должно быть или у меня что-то нет так?
    2. Посоветуйте как исправить.

    // Не увеличивается ширина ProgressBar'a (Delphi XE5 разработка под Android)

  16. Если говорить о размере приложения. То первоначально нужно понять, что входить в состав пакета? Затем определить, что нужно и не нужно?

     

    Давайте посмотрим на примере состав пакета небольшого Андроида приложения, написанного в RAD Studio XE5 Delphi. В качестве примера, я взял приложение PhotoEditorDemo, доступный на официальном Open Source проекте примеров RAD Studio XE5

     

    Это пример кроссплатформенного простого фоторедактора:

    Размер сжатого приложения

    Собираем приложение и смотрим на результирующий пакет PhotoEditorDemo.apk (Он располагается в директории .\Android\Debug\PhotoEditorDemo\bin относительно корня проекта).

     

    После сборки приложения его размер ~6 760 КБ (в зависимости от Debug or Release сборки). Это размер сжатого пакета нативного приложения.

     

    Размер распакованного приложения

    Если мы распакуем ZIP архиватором этот файл, то увидим его содержание:

    post-1-0-81223900-1389963410.jpg

    В распакованном виде, пакет занимает 21,7 МБ.

     

    Состав пакета

    Что же входит в его состав:

    1. lib - место хранения собранных натиных библиотек приложения. Поскольку приложение нативное, то оно работает на основании библиотеки .so.
    2. res - место хранения ресурсов приложения (картинки, иконки и тд)
    3. META-INF - хранение подписи приложения, контрольные суммы файлов ресурсов (картинок, звуков и т.д.)
    4. AndroidManifest.xml - манифест приложения (расширенный аналог VersionInfo в Windows)
    5. classes.dex - файл с java реализацией дополнительного функционала FireMonkey.
    6. resources.arsc - таблица ресурсов. В этом файле собраны xml-описания всех ресурсов.

    Самый значительный вклад в размер пакета вносят:

    1. libPhotoEditorDemo.so (20 060 КБ) - непосредственно сам бинарник приложения
    2. classes.dex (1 948 КБ) - частичная реализация FireMonkey на java.

    Размер самого приложения большой потому, что включает в себя полностью все Delphi библиотеки, которые используется FireMonkey. А это:

    1. RTL
    2. Хедеры для доступа к Android API
    3. Нативные стили для Android (три стиля - 1х, 1.5x, 2х, 3х скалирования экрана). Каждый стиль содержит исходную png картинку нативного стиля.
    4. Фильтры и эффекты FireMonkey
    5. Вся остальная реализация FireMonkey.

    Довольно большой набор того, что нужно включить в пакет и тяжело выбросить.

     

    Если говорить о приложении написанном в Eclipse, то приложение включает в себя только часть пользовательского кода. И размер мал за счет того, что весь Android API находится перманентно на самом устройстве (не в пакете).

     

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

     

    Вывод

    Размер установочного пакета приложения, написанного на FireMonkey не большой для нативных приложений порядка 6 760 КБ для реализации простого фоторедактора (Хотя для кого-то это может быть много). В установленном виде приложение занимает от 20 000 КБ. Основная причина полная интеграция используемых библиотек в пакет приложения. Вероятность уменьшить этот размер маловероятна. Однако увеличение функционала приложения не так сказывается на дальнейший рост приложения.

     

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

     

    На сколько важен размер приложения для конкретной работы приложения каждый заказчик решает сам.

     

    P.S. Цель этого ответа дать подробный ответ о причинах такого размера, а не попытка вызвать обсуждение на тему сравнения сред разработки. Каждый framework обладает своими достоинствами и недостатками. И выбор средства разработки диктуется совокупностью требования заказчика. 

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