Maka
-
Постов
60 -
Зарегистрирован
-
Посещение
-
Победитель дней
4
Сообщения, опубликованные Maka
-
-
В 20.11.2018 в 14:27, Tumaso сказал:
Попробуй вместо своей функции вызвать ACntrl.MakeScreenshot
Спасибо, то что нужно.
-
Для анимации плавного появления тяжелого окна использую плавное появление предварительно сделанного с него скриншота
Код получения скриншота:
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 результат получается нечетким (по всей видимости из-за использования какой-то компрессии).
Подскажите как повысить качество картинки?
-
1 час назад, wamaco сказал:
Попробуйте обернуть в Task
Спасибо, однако даже в теории не могу понять как это может помочь. Насколько я понимаю, причина лежит в тяжеловесности компонента TMediaPlayer и в том, что перед воспроизведением он выполняет некую долгую инициализацию.
А то что мы эту инициализацию делегируем в отдельный поток, ее никак не уменьшает.
И тем не менее, попробовал. Ожидаемо без положительного эффекта.
Мне кажется ключ должен быть, как заметил Евгений Корепов, в альтернативном способе воспроизведения. Вот только куда смотреть??
-
Цитата
Для начала избавьтесь от создания TMediaPlayer. Правда по приведенному коду неясно создается он каждый раз или используется первый созданный экземпляр. MediaPlayerOK и procedure Play_SoundOK потомки какой то одной формы?
MediaPlayerOK создается только при первом вызове.
ЦитатаНу и проигрывать звук лучше более простыми методами
да, забыл добавить, что речь об Android.
А не подскажете как раз под Android более простой метод?
-
Столкнулся с небольшой проблемой
Воспроизвожу звук стандартным 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 раз - то это незаметно, но если это, например, звук, воспроизводящийся при нажатии какой-то объект, и это происходит часто, то это очень бросается в глаза.
Как коллеги решают подобную проблему?
-
Разобрался.
Удаляем компонент, сохраняем проект, удаляем руками из файла *.fmx запись об удаленном компоненте, которая там по какой то причине осталась
-
В процессе написания приложения столкнулся с тем, что после активного использования, некоторые визуальные компоненты (причем это не зависит от их типа, может быть простой Button) не получается удалить в IDE (просто по Ctrl+Del)
Вернее удалить то получается, но после этого программа перестает запускаться под Android. (после начальной заставки молча закрыватется), хотя под Windows все работает.
Откатываем удаление и все снова запускается.
Причем у компонента убрал все обработки событий, в коде он нигде не фигурирует, стили не использует.
Подскажите, куда копать?
Нарисовать TСontrol без вывода на экран
в Print Screen
Опубликовано
Ситуация такая. Я хочу отобразит некий фрейм с кучей компонентов с использованием плавного проявления (анимация свойства 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 без вывода на экран?