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

ENERGY

Пользователи
  • Постов

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

  • Посещение

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

    57

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

  1. krapotkin

    В моем случае это явно будет лишнее. Часть времени потратить на отрисовку анимации. Там всего то 1 - 2 секунды.

    И кстати для отображения этого компонента, придется делать все тоже самое, что и для отображения лэйбла.

  2. В общем я решил так сделать.

    На пустой таб странице, на которой в будущем будет лежать фрейм кинул Ttext с надписью Loading .

    Дальше делаю так: 

    TabControl.SetActiveTabWithTransition  - загружаю с анимацей пустую страницу (на нее потом будет положен фрэйм) с надписью Loading - т.е. отодвигается текущая страница и загружается пустая.
     Application.ProcessMessages;  - это для того чтобы была анимация

    MyFrame.Parent := tiFrameTab;  - загружаю на табстраницу мой фрейм.

     Application.ProcessMessages; - нужно еще раз, чтобы установился размер высоты заголовков из стиля listboxgroupheader (иначе он не ставиться сам в этом случае)

  3. Спасибо за ответ!

    Если перед вызовом TabControl.SetActiveTabWithTransition добавить  PreloadContent(MyFrame); - то все также тормозит.

    Но если добавить после PreloadContent строчку Application.ProcessMessages; - то тогда анимация не тормозит.

    НО, там пауза около 2 секунд, получается юзер тапнул на Item и ждет 2 секунды пока фрэйм подгрузится...

    Наверное сделаю вообще без анимации.

    На компе не тормозит, тормозит только на телефоне..

     

  4. Программа имеет большое кол. элементов интерфейса и много экранов.

    Поэтому я сделал такую вещь - Таб контрол, на котором лежит часть постоянно загружаемого интерфейса, и одна закладка (tabPage) куда загружаются фреймы - там лежат редко используемые экраны,

    т.е. фрэйм создаю  в runtime, ставлю фрэйму MyFrame.Parent := FrameTabPage и показываю этот таб кодом  TabControl.SetActiveTabWithTransition

    Юзер ушел с этой страницы я убираю фрейм кодом MyFrame.Parent := nil

    Все работает, но  проблема в том что это сильно подтормаживает систему - в результате анимация Slide таба двигается рывками. Тормозит на этапе MyFrame.Parent := FrameTabPage, т.е. даже если я создам фрейм на этапе старта программы, то все равно будет тормозить на этом этапе MyFrame.Parent := FrameTabPage (видимо подгоняются размеры, на фрейме лежит ListBox с контролами ). .

    Если Parent фрэйма заранее поставить на нужный TabPage, то ничего не тормозит, но программа грузится дольше.

    Посоветуйте пожалуйста что можно тут придумать, ведь кто-то использует фреймы..

  5. Кривяков Виталий

     

    Спасибо за важную инфу.

    Я надеюсь корректор вы запускаете только когда это необходимо - только когда видите визуально что TPath не справился в Design Time или, в случае если загружаете TPath в Runtime, - когда он отвалился с определенным исключением.  Иначе это пустая растрата ресурсов на и так слабеньких моб. процах\аккумуляторах.

  6. Error 

    Все не так трагично, как вы описываете.

    Я проверял на Android 4.3, загрузил пару больших path с кучей деталей (картинка с наушниками и дерево из статьи), каких то артефактов не увидел, да сглаживания нет, но это настолько незаметно, что я бы даже не догадался присматриваться.

    И все равно это будет выглядит лучше чем если брать растровую картинку. 

    Дальше, размер векторных данных картинки с наушниками - 484 килобайта. И картинка с наушниками грузиться ~ 2 секунд. И это на довольно слабеньком телефоне.

    А картинка с деревом появляется мгновенно (41 кб)..

    delphi 1Berlin 10 upd 2  

     

  7. Как конвертировать растровую картинку в векторный TPath Firemonkey.
    How to convert a bitmap image (png, jpeg, bmp) into a Firemonkey vector TPath. Manual.


    Плюсы векторных изображений: 

    • Можно изменять размер избражения в любую сторону, уменьшать и увеличивать, без потери качества. Картинка всегда будет с четкими краями, без размытия по краям и квадратиков.
    • Можно легко изменять в RunTime цвет заливки и обводной рамки, изменяя цвета в полях Fill и Stroke компонента TPath. Заливка как правило одна - это цвет из свойства Fill Color. Но ... цвет может быть и градиентом из множества цветов, который можно указать в диспетчере объектов, там же можно загрузить и Bitmap как текстуру в качестве заливки. 
    • Можно анимировать изображение, изменяя вышеуказанные свойства, а также направление градиента, размер, толщину обводной линии итд.

    Тоже можно менять и для Stroke свойства - обводной рамки.

    Минусы:
    Получаемое изображение упрощенное. Т.к. оно может содержать только один путь (Path) и одну плоскость.
    Возможно получиться скомбинировать множества TPath, положив их друг на друга с прозрачностью. 
    Векторное изображение вычисляется и рисуется "в живую", поэтому потребуется больше ресурсов, чем при отрисовке обычных растровых картинок png, jpg, bitmap.
    Что означает нагрузку на аппаратную часть, замедление работы программы и более быструю разрядку мобильного устройства.
    Поэтому если и использовать подобные векторные изображения, то в случае если нужно отобразить большие картинки-символы на разных экранах (не иконки) - например на маленьком экране телефона, и на большом планшете и на еще большем Desktop экране. 
    Хотя в примере \Samples\Object Pascal\Multi-Device Samples\User Interface\CustomListBox\CustomListBox.dproj используется векторная иконка\чекбокс очень простая. 

     

    Преимущества векторного изображения наглядно:

    vectorImagevsBitmap.png

     

    Ингредиенты: 

    1. Векторный редактор, я взял бесплатный inkscape, который можно скачать здесь
    2. Картинка. Желательно чтобы картинка была с большим разрешением, от 300px и больше. Если взять изображение маленького размера, например 48x48 или 64x64, то контуры получатся не такими точными. И хотя inkscape все равно применит сглаживание контуров, и квадратиков вы не увидите, обводные линии могут получиться другой формы, к примеру более жирными или могут слиться с другими линиями.
    Исходное изображение лучше брать в формате PNG, т.к. JPEG оставляет артефакты в виде точек, в итоге программа при трассировке может захватить и их, что не желательно. Конечно же если другого исходника нету, то смысла конвертировать jpg в png нет - качество не улучшится.

    Основной метод конвертации - это трассировка изображения, - когда алгоритм ищет края и обводные линии, и на основе их рисует свои. Потому качественные результаты получаться если брать изображение с одной плоскостью, без теней, градиентов и деталей, в стиле Windows 8\10 или Android. Т.н. Flat (плоский) icon. 

    3. IDE RAD Studio Delphi или С++


    Приступим. 

    Запускаем incscape. 

    Размер исходной png картинки 668x720.
    broadcastsource.png

    1. Меню File > Open - указываем путь. Иконка загрузилась.

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

    3. Меню Path > Trace Bitmap. Сразу выберите чекбокс Live Preview (см скриншот).
    Здесь есть разные методы, но нам нужна секция Single Scan: Creates a Path. Методы нужно подбирать визуально, "на глаз". 
    Можно также использовать и секцию Multiply Scans, а затем скомбинировать пути в один (Path > Combine), т.к. нам нужен один путь, и один набор. Путь (Path) это набор инструкций о том как и сколько рисовать линий-векторов. Для нашего конкретного случая, этой конкретной иконки, оптимальный вариант Color Quantization и количество цветов = 2.

    Color qantization2.png

     

    4. Нажимаем OK и закрываем окно. Появилось наше изображение залитое черным цветом - это и есть наша векторная картинка. 
    Стоит заметить что прямо под ним лежит наше исходного изображение. Чтобы его удалить нужно отодвинуть мышкой векторное изображение, выделить исходную картинку и удалить ее клавишей Delete.  

    5. Вы можете отредактировать пути, выбрав в левой панели инструмент Edit Paths By nodes (F2) или добавить фильтры\эффекты в меню Path > Path Effects. В данном примере я ничего не менял.

    6. File Save As > inkscape SVG .

    7. Открываем полученный SVG файл в блокноте или в Lister тотал коммандера. Ищем массив чисел, который обычно начинается со строчки "<path". Находим эту строчку, нам нужно набор символов, который идет после буквы "d=", к примеру d="m 397.33334,c -48.1 ...-0.326 -1.64129,-0.66405 z" и копируем все, что внутри кавычек в буфер.
    8. Далее в RAD IDE кидаем на форму TPath. В Object Inspector WrapMode устанавливаем в Fit, и в поле Data вставляем из буфера наш код.
    9. Меняем Fill и Stroke цвета на нужные нам значения (здесь я установил желтый цвет и увеличил толщину обводки (Stroke)). 

    form3.png

     

    Еще пару примеров. 
    Дерево - параметры Brightness Cutoff, Threshold 0.370 . Как видите здесь оптимальнее подходит метод Brightness Cutoff.  Здесь исходная png картинка - это дерево черного цвета, я ее распознал, и затем добавил в TPath, а в свойстве Fill указал градиент от черного до зеленого.
    Наушники - Edge Detection 0. Конечно конкретно в этом случае нужно подчищать изображение.

    tree and headphones.png

     


    Иногда бывает что при вставке пути в TPath, компонент его отображает некорректно, если снова зайти в DATA TPath, то окажется что часть данных потеряна. 
    Что исправить эту ситуацию, нужно путь упростить. Это значит что после шага 4, нужно выбрать в incscrape меню Path > Simplify, затем снова сохранить файл. 
    Правда Simplify в incscrape работает не очень хорошо, часто загругляет прямые участки. Лучше делать Simplify в Adobe Illustrator.

     

    Статья опубликована на сайте fire-monkey.ru и возможно будет изменяться и дополняться.

    Автор: ENRGY  

    24. 02. 17 

     

  8. Error

    Да и без сглаживания это выглядит гораздо лучше чем растровые.

    Я не замечал там каких то заметных несглаженных искажений. К тому же можно приготовить в редакторе smooth картинку, скомбинировав ее из нескольких путей (слоев) и она будет вполне себе сглаженной .

     

    Да кстати, напишите то же самое разработчикам Windows. У них ужасное форсированное масштабирование на Win 8-10 для всех окон. Да оно сглаженное, но такое размытое, как будто сидишь с близорукостью.. Вот пример как не нужно сглаживать. Хорошо хоть эту "фичу" отключить можно, и то не везде.

  9. В 4/18/2016 в 10:14, Pax Beach сказал:

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

    Т.е. звонит будильник и человек останавливает и откладывает его на 10 мин?

    Нужно автозапускать свое Activity как расписано в этой статье и просто устанавливать новый интервал в AlarmManager. 

    Кстати, начиная с XE7 вместо генерации Dex  и подмены classes.dex можно просто подключить Jar файл. Надеюсь Ярослав осветит это в своей статье (заодно там bat файл нужно обновить, он не работает на новых версиях java).

  10. Большое спасибо что поддерживаете статьи в актуальном состоянии!

    Я также часто ссылаюсь на ваши статьи на других сайтах  - англоязычных.  Что удивительно подобная информация редко вcтречается на англоязычных сайтах, к примеру про Alarm Manager и Delphi нет ни одной статьи, даже на сайте Embarcadero этот вопрос долгое время висел без ответа, пока я не дал ссылку на вашу статью.

    Непопулярность Delphi Mobile как раз и связана с тем, кроме цены, что на многие вопросы почти нет ответов, при этом Java сообщество пестрит готовыми Copy Paste решениями, что увеличивает и без того большую армию пользователей. Но Java нет на iOS. И на Java не сделаешь кроссплатформенный проект с единым кодом и GUI, поэтому Delphi здесь на шаг впереди.

    Поэтому мне и показалось важным указать на ньюанс с JAR в темах связанными с DEX (заодно кстати и осветили баг с батником, помните javac -source 1.7 -target 1.7? - ведь на этом этапе у человека изучающего Delphi может пропасть желание изучать дальше),  столько плясок с бубном с этим dex, и разбросать чтобы больше людей увидели более удобный и простой вариант.

  11. Привет.

    Я тут узнал что оказывается начиная с XE7 не нужно создавать Dex файл затем подменять его на classes.dex.

    Достаточно создать Jar файл и подключить его к проекту.  

    А Dex файлы нужны для XE5 и XE6. Узнал я это из этого вопроса на stackoverflow.

    Пожалуйста Вы не могли бы обновить статью? Просто дописав эту заметку? На мой взгляд это важно.

    Я также обновил бат файл, 

    он будет примерно такой:

    @echo off
    setlocal
     
    if x%ANDROID% == x set ANDROID=c:\Users\Alex\Documents\Embarcadero\Studio\18.0\PlatformSDKs\android-sdk-windows
    set ANDROID_PLATFORM=%ANDROID%\platforms\android-24
    set PROJ_DIR=%CD%
    set VERBOSE=0
     
    echo.
    echo Compiling the Java service activity source files
    echo.
    mkdir output 2> nul
    mkdir output\classes 2> nul
    if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose
    javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\TestReceiver\AlarmReceiver.java
    
    
    echo.
    echo Creating jar containing the new classes
    echo.
    mkdir output\jar 2> nul
    if x%VERBOSE% == x1 SET VERBOSE_FLAG=v
    jar c%VERBOSE_FLAG%f output\jar\test_classes.jar -C output\classes com
    
    
    echo.
    echo Now we have the end result, in directory output\jar\
    pause
  12. Привет.

    Я тут узнал что оказывается начиная с XE7 не нужно создавать Dex файл затем подменять его на classes.dex.

    Достаточно создать Jar файл и подключить его к проекту. 

    Я проверил на новом проекте - все прекрасно работает. Проект автозапускается из AlarmManager (делал на основе этой статьи ) .А Dex файлы нужны для XE5 и XE6. Узнал я это из этого вопроса на stackoverflow.

    Пожалуйста Вы не могли бы обновить статью? Просто дописав эту заметку? На мой взгляд это важно.

    Я также обновил бат файл, 

    он будет примерно такой:

    @echo off
    setlocal
     
    if x%ANDROID% == x set ANDROID=c:\Users\Alex\Documents\Embarcadero\Studio\18.0\PlatformSDKs\android-sdk-windows
    set ANDROID_PLATFORM=%ANDROID%\platforms\android-24
    set PROJ_DIR=%CD%
    set VERBOSE=0
     
    echo.
    echo Compiling the Java service activity source files
    echo.
    mkdir output 2> nul
    mkdir output\classes 2> nul
    if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose
    javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\TestReceiver\AlarmReceiver.java
    
    
    echo.
    echo Creating jar containing the new classes
    echo.
    mkdir output\jar 2> nul
    if x%VERBOSE% == x1 SET VERBOSE_FLAG=v
    jar c%VERBOSE_FLAG%f output\jar\test_classes.jar -C output\classes com
    
    
    echo.
    echo Now we have the end result, in directory output\jar\
    pause

     

     

     

    Также еще один ньюанс.  Для варианта 2 никакой Dex файл не нужен. Также не нужен и Jar файл. 
    Также ничего не нужно в манифест добавлять, т.к. вызывается activity напрямую, без BroadcastReceiver.
    Но это только для варианта 2. Для первого варианта (Broadcast) все это нужно.

    Я проверял на новом проекте с вариантом 2 - все работает. 

  13. Тот же вопрос на http://stackoverflow.com/questions/42368123/how-to-pass-boolean-or-integer-to-intent-and-read-it-to-detect-that-my-activi

    Никакие свои аргументы добавлять из Java кода (putExtra) не нужноРешение использовать счетчик EXTRA_ALARM_COUNT: 

    uses
      Androidapi.Helpers,
      Androidapi.JNI.GraphicsContentViewText;
    ...
    var
      Intent: JIntent;
    ...
      Intent := TAndroidHelper.Activity.getIntent;
      if Intent.getIntExtra(TJIntent.JavaClass.EXTRA_ALARM_COUNT, 0) > 0 then
        lblInfo.Text := 'Started by Alarm Manager through FMX Activity';

     

    И насчет отправки аргумента при помощи putExtra из Java кода, все работает, просто я протупил, и регистрировал вызов своего активити напрямую (без Broadcast receiver), из примера номер 2 из из этой статьи .

    Кстати заодно я узнал что могу вместо Dex подключить Jar файл (начиная с XE7!), и это тоже работает, и гораздо проще! И кстати для примера номер 2 из той статьи (вызов активити напрямую - не нужен ни Dex файл, ни Jar ни манифест). Проверял на новом проекте.

     

  14. Andrey Efimov

    Там еще нужно все пути скомбинировать в один путь, плюс если путь сложный - он будет неправильно отображен (Tpath срежет часть данных), нужно его упростить (Simplify)

    krapotkin

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

    Еще один плюс, цвет заливки и рамки можно менять в RunTime - иконки могут быть любого цвета, всего лишь указать Fill Color и Stroke Color.

    А ведь еще можно и анимацию сделать.

  15. Ребята я разобрался! Как конвертировать любую картинку в формат TPath для FMX.

    Результат - см. png скриншот .

    Завтра или послезавтра напишу статью. Нужна прога inkscape, и кое какие манипуляции.

     

     

    testvector.png


    Пример для автора - векторный прямоугольник с дырой посередине:

    Спойлер

     

     - положите TPath на форму. В инспекторе в поле Data вставьте код ниже. Меняйте размер, цвет закраски в Fill и цвет рамки в Stroke полях, и WrapMode.

    Чтобы компонент был поверх остальных контролов - правая кнопка мыши по контролу > Control > Bring To Front

    M10.1297616958618,148.757736206055 C10.1297616958618,130.236892700195 10.1297616958618,111.716064453125 10.1297616958618,93.1952362060547 C72.8738098144531,93.1952362060547 135.617858886719,93.1952362060547 198.361892700195,93.1952362060547 C198.361892700195,130.236907958984 198.361892700195,167.278564453125 198.361892700195,204.320236206055 C135.617858886719,204.320236206055 72.8738021850586,204.320236206055 10.1297607421875,204.320236206055 C10.1297607421875,185.799392700195 10.1297607421875,167.278564453125 10.1297607421875,148.757736206055 Z M121.271415710449,191.892364501953 C140.307022094727,189.118347167969 160.603515625,182.84098815918 173.259811401367,167.468536376953 C179.926818847656,159.732299804687 180.693664550781,148.353652954102 177.046997070313,139.122909545898 C167.600173950195,122.481338500977 148.677352905273,114.167030334473 130.674224853516,110.43505859375 C103.920913696289,104.999694824219 74.7656555175781,107.082946777344 50.4250106811523,120.101829528809 C39.0806159973145,126.404968261719 27.5140514373779,137.55696105957 28.6953926086426,151.623291015625 C28.596643447876,164.663223266602 39.6976737976074,174.31201171875 50.1407165527344,180.36116027832 C71.6506423950195,192.344253540039 97.1735076904297,194.539932250977 121.271423339844,191.892349243164 Z 

     

     

  16.  1. Я вот нашел костыльное решение - делаем SVG в каком то векторном редакторе, сохраняем его в svg и затем грузим на этот сайт https://petercollingridge.appspot.com/svg-editor .
    Дальше выбираем Edit (experimеntal) и уже эти циферки можно копировать в TPath - это будет работать, хотя это все не то. Нужно обвести иконку.

    2. Возможный вариант номер 2  (не проверял еще).

    Adobe Illustrator

    http://lessons.livecode.com/m/33498/l/325452-getting-svg-path-data-for-svg-icon-extension

    Правда это громадный пакет. Может кто подскажет что получше.

     

     

  17. 5 часов назад, Rusland сказал:

    А чем не устраивает программа из видео?

    Во первых PixPower на немецком,  а версии на английском нету. Я не с первой попытки открыл иконку, а уж что-то другое сделать и подавно не смогу - к примеру как показать эту панельку с SVG DATA..

    Во вторых проект уже давно не развивается, последняя версия 2006 года. 

    Я думал возможно кто-то подскажет более продвинутый редактор SVG.  

  18. Самый простой вариант - нарисовать в обычном графическом редакторе нужный прямоугольник с дыркой и сохранить его в png.

    Сложный вариант копать сторону TPath - - по факту это SVG формат, векторная графика. Можно сделать вот как на видео (обвести иконки, создать path и закинуть SVG данные вTPath). 

    Только вот я не знаю в какой программе это делать, если узнаете подскажите тоже в этой теме.

     

     

     http://www.webdelphi.ru/2012/04/firemonkey-2/

     

     

     

  19. Кстати я тоже заметил проблему когда портятся картинки в TimageList . Проблема возникает когда часто пользуешься ImageList в Design Time. 

    Стоит Berlin Update 2

    На них возникают какие то артефакты, типа решетки, или муара. И все, она сохраняется такой в ImageList, и в следующие разы нужно заменять картинку полностью. 

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

    Groups48.png

     

  20. Menkos1

    Это код для уменьшения размера exe под Windows. Добавляшь в Dpr файл (Project > View Source),  выбираешь Release в правой панели, затем Project  > Build. Размер еще уменьшиться.

    Правда потом нужно протестировать программу. На VCL с этими директивами у меня проблем никогда не было, - в смысле каких то багов в программе. На FMX не пробовал (я FMX пока только под моб. девайсы использую)

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