Alex7wrt
-
Постов
508 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Сообщения, опубликованные Alex7wrt
-
-
Пробовали сделать все 120 картинок в один ряд, без столбцов?
-
Все равно спасибо за участие!
-
Это пути к файлам Android SDK, которая в целом отношения к студии не имеет. Если она у вас расположена в папке Берлина, то укажите пути к ней и все.
-
9 часов назад, krapotkin сказал:
на Xiaomi Redmi Note 3 pro норм. на 5А - тоже. до 5-ки пока не добрался
На этих телефонах экран 16/9, а не 18/9. Как раз в Redmi 5 и есть мой вопрос. Если получится посмотреть, буду очень благодарен
-
2 часа назад, krapotkin сказал:
в силу отсутствия рамок на андроиде нет смысла Borderstyle выставлять. сбросил в sizable
на Xiaomi Redmi Note 3 pro норм. на 5А - тоже. до 5-ки пока не добрался
Этот параметр остался из единого кода с iOS, где он скрывает статусбар.
-
Все-таки сделал пример. Прикрепил архив с проектом
Вот весь код:
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 рамка справа намного шире, из-за чего картинка теряет симметрию. Скорее всего это из-за некорректного определения размера экрана
-
Да вот с этим проблема
Само приложение представляет собой клиент, который работает только в связке с серверной частью на компе, поэтому скинуть не получится
А сам Redmi 5 мне на данный момент не доступен, поэтому сомневаюсь, что сделаю адекватный пример. Вчера на нем тестировал. Если бы был при мне, может быстрее нашел бы решение.
Но Redmi 3S у меня есть, на нем как и на абсолютно всех других телефонах с соотношением 16 на 9 и меньше, и с аппаратными кнопками, все работает норм.
Думаю сама концепция тестового примера сводится к следующему
В свойствах формы FullScreen = true; BorderStyle = bsNone;
Помещаем 2 кнопки, и для их горизонтальных координат указываем то, что я писал в посте выше
X:=20;
X:=Screen.Width - W - 20;
-
Добрый день
Есть приложение, которое работает в полноэкранном режиме.
Первый раз тестил его на экране с соотношением сторон 18:9 (Xiaomi Redmi 5).
По умолчанию приложение открывается с черными полосами сверху/снизу либо слева/справа (смотря какая ориентация)
В недрах настроек телефона есть опция "полноэкранный режим", где любому приложению можно разрешить/запретить работу на весь экран.
При активации этой опции для моего приложения, размер экрана все равно определяется неверно (должно быть 1440*720, а получаю 1344*720), и из-за этого при отрисовке элементов интерфейса вблизи границ экрана получаю не то, что должно быть.
Например, есть элемент шириной W, тогда при отрисовке элемента в точке с горизонтальным значением Point.X:=20 и в точке с Point.X:=Screen.Width - W - 20, получаю разные расстояния от элемента до левой и правой стороны экрана соответственно (альбомная ориентация).
При этом для "обычных" экранов все работает отлично.Подозреваю, что это как-то связано с наэкранными кнопками меню, но не знаю, это особенность Xiaomi или вообще всех таких современных экранов.
Кто в теме, подскажите.
-
Добрый день.
Столкнулся со следующей задачей: не получается использовать микрофон под iOS. В документации Apple нашел следующее: ссылка. Судя по этой информации, начиная с iOS 10 нужно выполнять запросы на разрешение использования тех или иных функций.
Кто-нибудь знает как добавить запрос на разрешение использования микрофона в iOS?
На тестируемом устройстве установлена iOS 11.4. Среда 10.1.2.
-
Проверьте в Project->Options->User Permissions проставлены ли разрешения на Modify Audio Settings и Record Audio (предполагаю, что после Bass_Init вы пишите Bass_RecordInit, как в моем примере).
-
-
Можно еще поиграться с размером буфера в Bass, который измеряется в миллисекундах и по умолчанию равен 500. Чем он больше, тем меньше вероятность потерь, но больше задержка звука при стримминге.
-
Может быть. Не могу подтвердить или опровергнуть ваше предположение, но в моем случае передача звука происходит в локальной сети, не в интернете. Через все роутеры, включая точку доступа со смартфона, все работало хорошо, без потерь.
-
2 часа назад, Martifan сказал:
все хорошо спасибо большое
это все еще через Opus прогнать и будет просто суперМетодом проб и ошибок обнаружил, что для речи запись с частотой дискретизации 16000 выдает практически такое же качество, как и 44100, но ощутимо лучше, чем 8000. При этом используется одноканальная запись (моно), что с учетом 16 бит на семпл дает 32 кБ/с (256 кбит/с), что не сильно нагружает WiFi сеть. Потерь нет (и это в UDP протоколе).
Также, одна из причин, почему я не использую сжатие в данном приложении, это телефоны-приемники, которые у нас по большей части старые смартфоны с одноядерным процессорм. А в приложении кроме аудиочата есть и другие нагружающие фичи. Не хочется лишний раз нагружать проц и садить батарею, если и так все норм.
-
3 часа назад, Martifan сказал:
спасибо за ответ но на Android как делать этого и без использывание Bass знаю мне интересует как это сделать на iOS
Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.
4 часа назад, Виталий Иванов сказал:Эх примерчик бы того как вы захватываете потом и отправляете его клиентуи как принимаете. Уже нескольок недель гуглю в этом направлении и инфы ноль. А бы ло бы интересно посмотреть как это работает. И да находил инфу что через bass.dll это делают захватывают поток с устройсва (микрофона) в событии захвата потока добавляют заголовк для куска (заголовок кодека) и передают его на клиента, но инфы о том как клиент должен это получить и воспроизвести нету да и вообще не будет ли случаем прерывании мезжу полученными кусками и как с памятью обстоят дела ? я так понимаю что для этого мазахизма выделяется какойто буфер и внесго складывается или дописываетс и наверное передача идет попакетно а не потоком (record package). (и это толкьо малая часть вопросов )
Вообщем если не сложно можете поделится примером а то вопросов больше чем ответов
Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше.
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. Буквально на днях решал похожую задачу под Android (аудио чат в пределах локальной сети) с использованием данной библиотеки. Она же доступна и под iOS.
-
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;
-
2 часа назад, Barbanel сказал:
Не могу сказать. По моим личным наблюдениям, такое окно выводят очень редко.
Вернее, я ни разу не видел (пока еще ни разу) чтобы свежая версия программы (т.е. она была ранее установлена и просто обновилась через гугл плей) показывала мне такое окно.Сразу после установки программы - да, было пару раз.
А в тех приложениях, где вы видели подобное окно, была информация о том, что личные данные собирает Google для рекламы или же о том, что сам разработчик приложения собирает данные для своих целей?
-
1 час назад, chellas88 сказал:
можно подробнее?
Кидаете на форму панель, нажимаете на нее правой кнопкой - > Edit Custom Style - > И там в стиле меняете свойство Fill
-
Спасибо за подробный ответ.
Но дело в том, что лично я никаких данных пользователя не собираю. Насколько я понял, данные собирает Google для отображения рекламы в баннере, который есть в приложении. Какие именно данные собирает Google, я тоже не знаю.
Поэтому я не понимаю, как реализовать те пункты, которые вы указали.
На странице Admob есть ссылка на инструкцию (https://developers.google.com/admob/android/eu-consent) как отобразить диалоговое окно в Android Studio. Но как это сделать в FMX не понятно.
И, кстати, также интересует вопрос, что будет, если не выводить диалоговое окно, если ничего не предпринять? Приложение перестанет быть доступным для стран ЕС или последуют какие-нибудь иные ограничения?
-
26 минут назад, chellas88 сказал:
Получается что и TPanel никак не изменить цвет?
Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
-
Спасибо за совет, но ваш второй ответ противоречит первому. Хотелось бы точно знать что к чему с этой штукой.
-
-
Добрый день.
Только сегодня узнал о такой штуке как GDPR о защите персональных данных пользователей из ЕС, в соответствии с которой Google вводит что-то вроде инструмента разрешения для обработки данных пользователей, которые используются для подбора рекламы в AdMob. Кто-нибудь знает об этом более подробно? Прежде всего интересует, какие изменения нужно вносить в приложение, чтобы реклама продолжала отображаться в баннере.
Увеличение содержимого TImage
в Графика
Опубликовано · Изменено пользователем Alex7wrt
C помощью DrawBitmap отрисовать канву увеличиваемой области в прямоугольнике большего размера.