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

Alex7wrt

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

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

  • Посещение

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

    31

Весь контент Alex7wrt

  1. C помощью DrawBitmap отрисовать канву увеличиваемой области в прямоугольнике большего размера.
  2. Пробовали сделать все 120 картинок в один ряд, без столбцов?
  3. Это пути к файлам Android SDK, которая в целом отношения к студии не имеет. Если она у вас расположена в папке Берлина, то укажите пути к ней и все.
  4. На этих телефонах экран 16/9, а не 18/9. Как раз в Redmi 5 и есть мой вопрос. Если получится посмотреть, буду очень благодарен
  5. Этот параметр остался из единого кода с iOS, где он скрывает статусбар.
  6. Все-таки сделал пример. Прикрепил архив с проектом app.zip Вот весь код: procedure TForm1.FormCreate(Sender: TObject); var i: byte; begin Container:=TRectangle.Create(Form1); with Container do begin Parent:=Form1; Align:=TAlignLayout.Contents; Stroke.Kind:=TBrushKind.None; Fill.Color:=TAlphaColors.Black; end; for i:= 1 to 4 do with TRectangle.Create(Container) do begin Parent:=Container; Stroke.Kind:=TBrushKind.None; Fill.Color:=TAlphaColors.White; end; end; procedure TForm1.FormResize(Sender: TObject); var i: byte; begin w:=screen.Width; h:=screen.Height; for i:= 1 to 4 do begin with TRectangle(Container.Children[i-1]) do begin Height:=min(w,h)*(0.35+0.1*byte(w>h)); Width:=Height*1.33; if h>w then begin Position.X:=(w - 2*Width-0.1*width)*0.5 + ((i+1) mod 2)*(Width+0.1*width); Position.Y:=(h - 2*Height-0.6*width)*0.5 + (i div 3)*(Height+0.1*width); end else begin Position.X:=(w - Width-0.03*h)*((i+1) mod 2)+0.015*h; Position.Y:=(h - Height-0.03*h)*max((round(i*0.5)-1),0)+0.015*h; end; end; end; end; В альбомной ориентации на "обычных" устройствах интерфейс имеет следующий вид: Но на Redmi 5 рамка справа намного шире, из-за чего картинка теряет симметрию. Скорее всего это из-за некорректного определения размера экрана
  7. Да вот с этим проблема Само приложение представляет собой клиент, который работает только в связке с серверной частью на компе, поэтому скинуть не получится А сам Redmi 5 мне на данный момент не доступен, поэтому сомневаюсь, что сделаю адекватный пример. Вчера на нем тестировал. Если бы был при мне, может быстрее нашел бы решение. Но Redmi 3S у меня есть, на нем как и на абсолютно всех других телефонах с соотношением 16 на 9 и меньше, и с аппаратными кнопками, все работает норм. Думаю сама концепция тестового примера сводится к следующему В свойствах формы FullScreen = true; BorderStyle = bsNone; Помещаем 2 кнопки, и для их горизонтальных координат указываем то, что я писал в посте выше X:=20; X:=Screen.Width - W - 20;
  8. Добрый день Есть приложение, которое работает в полноэкранном режиме. Первый раз тестил его на экране с соотношением сторон 18:9 (Xiaomi Redmi 5). По умолчанию приложение открывается с черными полосами сверху/снизу либо слева/справа (смотря какая ориентация) В недрах настроек телефона есть опция "полноэкранный режим", где любому приложению можно разрешить/запретить работу на весь экран. При активации этой опции для моего приложения, размер экрана все равно определяется неверно (должно быть 1440*720, а получаю 1344*720), и из-за этого при отрисовке элементов интерфейса вблизи границ экрана получаю не то, что должно быть. Например, есть элемент шириной W, тогда при отрисовке элемента в точке с горизонтальным значением Point.X:=20 и в точке с Point.X:=Screen.Width - W - 20, получаю разные расстояния от элемента до левой и правой стороны экрана соответственно (альбомная ориентация). При этом для "обычных" экранов все работает отлично.Подозреваю, что это как-то связано с наэкранными кнопками меню, но не знаю, это особенность Xiaomi или вообще всех таких современных экранов. Кто в теме, подскажите.
  9. Добрый день. Столкнулся со следующей задачей: не получается использовать микрофон под iOS. В документации Apple нашел следующее: ссылка. Судя по этой информации, начиная с iOS 10 нужно выполнять запросы на разрешение использования тех или иных функций. Кто-нибудь знает как добавить запрос на разрешение использования микрофона в iOS? На тестируемом устройстве установлена iOS 11.4. Среда 10.1.2.
  10. Проверьте в Project->Options->User Permissions проставлены ли разрешения на Modify Audio Settings и Record Audio (предполагаю, что после Bass_Init вы пишите Bass_RecordInit, как в моем примере).
  11. Alex7wrt

    Audio Streaming

    Можно еще поиграться с размером буфера в Bass, который измеряется в миллисекундах и по умолчанию равен 500. Чем он больше, тем меньше вероятность потерь, но больше задержка звука при стримминге.
  12. Alex7wrt

    Audio Streaming

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

    Audio Streaming

    Методом проб и ошибок обнаружил, что для речи запись с частотой дискретизации 16000 выдает практически такое же качество, как и 44100, но ощутимо лучше, чем 8000. При этом используется одноканальная запись (моно), что с учетом 16 бит на семпл дает 32 кБ/с (256 кбит/с), что не сильно нагружает WiFi сеть. Потерь нет (и это в UDP протоколе). Также, одна из причин, почему я не использую сжатие в данном приложении, это телефоны-приемники, которые у нас по большей части старые смартфоны с одноядерным процессорм. А в приложении кроме аудиочата есть и другие нагружающие фичи. Не хочется лишний раз нагружать проц и садить батарею, если и так все норм.
  14. Alex7wrt

    Audio Streaming

    Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же. Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше. uses FMX.Radio.Bass; var BLoaded: boolean; chanPlay, ChanMic: Dword; avail, freq: word; buffer: TIDBytes; procedure TForm1.OnCreate(Sender: TObject); begin //Создаем UDP сервер UDP_Rec:=TIDUDPServer.Create; with UDP_Rec do begin DefaultPort:=UDP_RecPort; BufferSize:=1600; BroadcastEnabled:=true; Active:=true; end; freq:=16000; //Частота дискретизации setlength(buffer,UDP_Rec.BufferSize); BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку BASS_RecordInit(-1); //Инициализируем запись end; //Захват звука с микрофона procedure TForm1.Recording(Sender: TObject; const Point: TPointF); begin isrecording:=not isrecording; if isrecording then begin UDP_Rec.OnUDPRead:=nil; chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil); VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP end end; //Передача буффера в потоке procedure TVoiceThread.Execute; begin while isrecording do begin try avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE); if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем try BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize); UDP_Rec.Broadcast(Buffer,UDP_RecPort); except end; end; finally sleep(20); end; end; BASS_ChannelStop(chanmic); BASS_StreamFree(chanmic); end; //Создание канала для воспроизведения звука из буффера: procedure TForm1.receiving(Sender: TObject); begin chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil); UDP_Rec.OnUDPRead:=UDP_RecRead; BASS_ChannelPlay(chanPlay, false); end; //Получаем буффер из UDP procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin try BASS_StreamPutData(chanPlay, AData,length(AData)) except end; end; Bass.zip
  15. Alex7wrt

    Audio Streaming

    Советую обратить внимание на библиотеку Bass. Буквально на днях решал похожую задачу под Android (аудио чат в пределах локальной сети) с использованием данной библиотеки. Она же доступна и под iOS.
  16. uses VCD: TVideoCaptureDevice; ABitmap: TBitmap; bd: TBitmapData; ----------------------- В событии OnVideoBufferReady добавляете: VCD.SampleBufferToBitmap(ABitmap,true); with ABitmap do begin if Map(TMapAccess.ReadWrite, bd) then try // Здесь делаете преобразования пикселей битмапа с помощью функций bd.GetPixel и bd.SetPixel finally Unmap(bd); end; SaveToFile('Сохраняем ABitmap'); Free; end; end;
  17. А в тех приложениях, где вы видели подобное окно, была информация о том, что личные данные собирает Google для рекламы или же о том, что сам разработчик приложения собирает данные для своих целей?
  18. Кидаете на форму панель, нажимаете на нее правой кнопкой - > Edit Custom Style - > И там в стиле меняете свойство Fill
  19. Спасибо за подробный ответ. Но дело в том, что лично я никаких данных пользователя не собираю. Насколько я понял, данные собирает Google для отображения рекламы в баннере, который есть в приложении. Какие именно данные собирает Google, я тоже не знаю. Поэтому я не понимаю, как реализовать те пункты, которые вы указали. На странице Admob есть ссылка на инструкцию (https://developers.google.com/admob/android/eu-consent) как отобразить диалоговое окно в Android Studio. Но как это сделать в FMX не понятно. И, кстати, также интересует вопрос, что будет, если не выводить диалоговое окно, если ничего не предпринять? Приложение перестанет быть доступным для стран ЕС или последуют какие-нибудь иные ограничения?
  20. Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
  21. Спасибо за совет, но ваш второй ответ противоречит первому. Хотелось бы точно знать что к чему с этой штукой.
  22. Хорошо, если так и есть. Но инфа на странице Admob дает повод задуматься:
  23. Добрый день. Только сегодня узнал о такой штуке как GDPR о защите персональных данных пользователей из ЕС, в соответствии с которой Google вводит что-то вроде инструмента разрешения для обработки данных пользователей, которые используются для подбора рекламы в AdMob. Кто-нибудь знает об этом более подробно? Прежде всего интересует, какие изменения нужно вносить в приложение, чтобы реклама продолжала отображаться в баннере.
×
×
  • Создать...