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

Maka

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

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

  • Посещение

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

    4

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

  1. Ситуация такая. Я хочу отобразит некий фрейм с кучей компонентов с использованием плавного проявления (анимация свойства Opacity)

    Если анимировать на прямую, то объекты фрейма проявляются не равномерно, и вообще выглядит не красиво.

    Выход: Сделать скриншот фрейма, плавно и красиво его показать, потом скрыть и на его место поместить целевой фрейм.

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

    Пробовал делать MakeScreenshot в событии onPaint фрейма, и там же его скрыть сразу. Действует, но периодически получается моргание, из-за того, что фрейм все же на долю секунды появляется на экране.

    Пробовал делать Repaint рекурсивно для фрейма и всех дочерних элементов перед снятием скриншота:

      procedure Repchild(aCtr: TControl);
      var
        xA: SmallInt;
      begin
        aCtr.Repaint;
        for xA := 0 to aCtr.ChildrenCount - 1 do if aCtr.Children[xA] is TControl then Repchild(Tcontrol(aCtr.Children[xA]));    
      end;

    без результатно.

    Подскажите, как отрисовать TContro без вывода на экран?

  2. Для анимации плавного появления тяжелого окна использую плавное появление предварительно сделанного с него скриншота

    Код получения скриншота:

    function Screenshot(ACntrl: TControl): TBitmap;
      var
        SourceRect: TRectF;
      begin
        SourceRect := TRectF.Create(0, 0, ACntrl.Width, ACntrl.Height);
        Result := TBitmap.Create(Round(SourceRect.Width), Round(SourceRect.Height));
        if Result.Canvas.BeginScene then
          try
            ACntrl.PaintTo(Result.Canvas, SourceRect);
          finally
            Result.Canvas.EndScene;
          end;
      end;

    В Windows все нормально, а вот в Android результат получается нечетким (по всей видимости из-за использования какой-то компрессии).

    image.png.f854b4baf6da3b58405d694f397afb64.png

    Подскажите как повысить качество картинки?

     

  3. 1 час назад, wamaco сказал:

    Попробуйте обернуть в Task

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

    А то что мы эту инициализацию делегируем в отдельный поток, ее никак не уменьшает.

    И тем не менее, попробовал. Ожидаемо без положительного эффекта.

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

  4. Цитата

    Для начала избавьтесь от создания TMediaPlayer. Правда по приведенному коду неясно создается он каждый раз или используется первый созданный экземпляр. MediaPlayerOK и procedure Play_SoundOK потомки какой то одной формы?

    MediaPlayerOK создается только при первом вызове.

    Цитата

    Ну и проигрывать звук лучше более простыми методами

    да, забыл добавить, что речь об Android.

    А не подскажете как раз под Android более простой метод?

  5. Столкнулся с небольшой проблемой

    Воспроизвожу звук стандартным Media Player'ом вот так:

    var 
      MediaPlayerOK: TMediaPlayer;
    
    procedure Play_SoundOK;
    begin  
      if not Assigned(MediaPlayerOK) then begin
        MediaPlayerOK := TMediaPlayer.Create(nil);    
        MediaPlayerOK.FileName := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, 'ok-3.3gp');
      end;
      MediaPlayerOK.CurrentTime := 0;
      MediaPlayerOK.Play;
    end;

    Воспроизведение запускается с ощутимой задержкой (сотни мс). Если файл длинный и воспроизводится 1 раз - то это незаметно, но если это, например, звук, воспроизводящийся при нажатии какой-то объект, и это происходит часто, то это очень бросается в глаза.

    Как коллеги решают подобную проблему?

  6. В процессе написания приложения столкнулся с тем, что после активного использования, некоторые визуальные компоненты (причем это не зависит от их типа, может быть простой Button) не получается удалить в IDE (просто по Ctrl+Del)

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

    Откатываем удаление и все снова запускается.

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

    Подскажите, куда копать?

     

     

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