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

Alex7wrt

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

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

  • Посещение

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

    31

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

  1. Возможно, проблема в том, что вы не обнуляете переменную CurrentPath. И при повторном нажатии на Item в ней будет строка, которая уже не является путём к директории или файлу. Поэтому код не срабатывает.
  2. Первый раз слышу о проблемах с TThread.Synchronize.
  3. Если нужны небезопасные разрешения. Если таковые не нужны, то костыль не нужен. Хотя не такой уж это и костыль (Если речь о решении Андрея Ефимова). А вполне хорошая вещь.
  4. Google уже пообещала с лета ограничивать приложения, TargetSDK которых ниже актуальной версии на 2 единицы и более. Так что гнаться нужно будет обязательно, чтобы приложение осталось в Google Play
  5. Да, реклама показывается
  6. Разве возможность выдавать разрешения в рантайм не может появиться в будущих версиях FMX? (Тем более что пример от Андрея Ефимова подтверждает, что и сейчас это решаемо). Тоже самое и насчет 64 битных приложений. Почему вы считаете, что нужно валить с делфи? Думаю, вопрос не только в разрешениях? Будьте добры, подскажите, на чем основываются ваши соображения. Просто собираюсь дальше писать под Андроид и немного неожиданно было прочесть такую инфу в вашем комментарии )).
  7. Если нужно убрать контур полностью, то Rec_1.Stroke.Kind:=TBrushKind.None; Если нужно отобразить не все стороны, то Rec_1.Sides := [TSide.Top, TSide.Left, TSide.Right];
  8. Добрый день. Совсем недавно появилась информация, что с апреля все публикуемые в App Store приложения должны обязательно поддерживать экран смартфона Apple iPhone X. В связи с этим естественно напрашивается вопрос, как это реализовать в Rad Studio и что вообще подразумевается под поддержкой такого экрана - чтобы в приложении было предусмотрено место под выемку? Кто в курсе, подскажите, что к чему.
  9. Тоже есть вопрос по этой теме. Для того, чтобы уже размещенные приложения продолжали быть доступными - достаточно ли обновить годовую подписку, или же нужно заново получать все сертификаты (у них тоже ограничение 1 год), пересоздавать приложение с новыми сертификатами и обновлять его в App Store?
  10. Попробуйте менять значение параметра CurrentTime (название пишу по памяти, но вроде правильно) на длительность кадра. По идее должно сработать.
  11. Здесь речь идёт о значении targetSDK в файле манифеста. Этот параметр влияет на то, использует ли приложение новые функции последних версий SDK. То есть какие SDK приложение гарантированно поддерживает. Но если сейчас этому параметру разработчик может в принципе придавать любые значения, то со второй половины этого года Google вводит правило, что он должен быть не ниже предпоследней версии. То есть если сейчас последняя версия равна 27, значит этот параметр должен быть с августа не ниже 26 для новых приложений, а с ноября для обновлений. В дальнейшем раз в год по мере выхода новых версий Android нужно повышать это значение на 1. Так Google побуждает разработчиков использовать функции новых версий SDK. Чтобы соответствовать этим требованиям, нужно обновлять значение параметра TargetSDK в файле манифеста, и все будет норм.
  12. procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if key=vkHardwareBack then begin //Здесь делаем, что нужно key:=0; //Предотвращаем закрытие приложения end; end;
  13. Причем, строка в манифесте: <meta-data android:name="com.google.android.gms.version" android:value="4323000" /> появляется при включении Admob Service в Project->Options->Entitlement list и в последней версии студии 10.2.2, которая была выпущена недавно. Значит ли это, что Rad Studio не поддерживает Mobile Ads SDK выше этой версии? Или этот параметр ни на что не влияет, в том числе и на то, что Google перестанет поддерживать Mobile Ads SDK старше 7.0.0?
  14. Все же возникли сомнения на этот счет. Прочел разную инфу и уже не уверен в правильности своего ответа. Не могу понять, нужно обновлять переменную <meta-data android:name="com.google.android.gms.version" android:value="4323000" /> в манифесте или достаточно наличия последней версии SDK. Гугл говорит, что версии Mobile Ads SDK старше 7.0.0 поддерживаться не будут. Но сейчас он является частью Google Play Services. Если проект собран с последней версией Google Play Services, достаточно ли этого? Или же нужно менять и переменную com.google.android.gms.version в манифесте? Кто может подсказать?
  15. Чтобы не было красного крестика, нужно не только создать эмулятор в AVD менеджере, но и запустить его там же. В итоге на экране увидите окно, в котором запускается интерфейс Android. Когда он запустится, и появится рабочий стол Android, можно запускать установку приложения на эмулятор. Только учтите, что на относительно слабых системах эмулятор может запускаться довольно долго. Ну и Вообще для проверки работоспособности (работает/ не работает) легче воспользоваться установкой на реальный девайс.
  16. Тогда TZNativeDrawFigureArc замените на TArc. Может на ваших целевых устройствах будет нормально отрисовываться.
  17. Может быть вам пригодится - мой пример векторного подхода к AniIndicator без использования картинок и для различных разрешений экрана. Для отрисовки дуги использовал компонент Равиля на основе FMX.Graphics.Native, поскольку стандартные функции не красиво рисуют под Андроидом. Сам индикатор: unit newaniindicator; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Ani, FMX.Objects, FMX.Layouts, FMX.ZNativeDrawFigure; type TNewAniIndicator = class(TZNativeDrawFigureArc) Animation: TFloatAnimation; procedure AnimationProcess(Sender: TObject); procedure AnimationFinish(Sender: TObject); procedure IndicatorResize(Sender: TObject); procedure Start; procedure Stop; Constructor Create(AOwner: TComponent); override; Destructor Destroy; override; private active: boolean; public colors: array of TAlphaColor; end; implementation constructor TNewAniIndicator.Create(AOwner: TComponent); begin inherited Create(AOwner); Fill.Kind:=TBrushKind.None; Stroke.Cap:=TStrokeCap.Round; Stroke.Join:=TStrokeJoin.Round; Animation:=TFloatAnimation.Create(Self); with Animation do begin Parent:=Self; Duration:=1; StartValue:=-90; StopValue:=270; PropertyName:='StartAngle'; Interpolation:=TInterpolationType.Quadratic; OnProcess:=AnimationProcess; OnFinish:=AnimationFinish; end; OnResize:=IndicatorResize; end; destructor TNewAniIndicator.Destroy; begin Animation.Free; inherited; end; procedure TNewAniIndicator.IndicatorResize(Sender: TObject); begin Stroke.Thickness:=Width*0.1; end; procedure TNewAniIndicator.Start; begin active:=true; Stroke.Color:=colors[0]; Visible:=true; Animation.Start; end; procedure TNewAniIndicator.Stop; begin active:=false; Visible:=False; Animation.Stop; end; procedure TNewAniIndicator.AnimationProcess(Sender: TObject); begin EndAngle:=-0.0037*sqr(StartAngle)+0.667*StartAngle+90; //Функция сжатия/растяжения дуги end; procedure TNewAniIndicator.AnimationFinish(Sender: TObject); var i: byte; begin if active then begin i:=0; while colors[i] <> Stroke.Color do inc(i); if i=length(colors)-1 then Stroke.Color:=colors[0] else Stroke.Color:=colors[i+1]; Animation.Start; end; end; end. Далее в программе: ani:=TNewAniIndicator.Create(form1); with ani do begin Parent:=Form1; Width:=Form1.Width*0.2; Height:=Width; setlength(colors,6); colors[0]:=TAlphaColors.Red; colors[1]:=TAlphaColors.Orange; colors[2]:=TAlphaColors.Yellow; colors[3]:=TAlphaColors.Green; colors[4]:=TAlphaColors.Blue; colors[5]:=TAlphaColors.Violet; Start; end; newaniindicator.zip
  18. Если все же решили остановиться на BitmapListAnimation, то нарисуйте в графическом редакторе такой индикатор, который вам нравится, и устраивающий вас по размеру. Далее, напишите в Делфи простенькую программу, которая поворачивает это изображение на определенный угол в зависимости от того, сколько кадров анимации вам нужно. Если 30 кадров, то на угол 360/30 = 12 градусов. И сохраните этот массив из 30 картинок в одно изображение. Это и будет ваша заготовка для BitmapListAnimation. В дальнейшем, если решите заменить индикатор анимации, то будет уже легче это сделать с такой программкой. Все ИМХО конечно. Но когда-то делал именно так, правда все равно перешёл на векторный вариант, потому что хотел чтоб индикатор ещё и цвет менял после каждого оборота.
  19. Я рисовал дугу, которая при вращении растягивается/сжимается с помощью TFloatAnimation и меняет цвет после каждого оборота. Вроде векторного подхода, норм для любого разрешения экрана.
  20. Думаю, что не должно быть.
  21. Насколько я понимаю, речь идет о том, какую версию Google Mobile Ads SDK вы используете. И манифест здесь ни при чем. Google Mobile Ads SDK сейчас является составной частью Google Play Services. И если вы регулярно обновляете SDK под Android, то все должно быть норм. Если ни так, поправьте меня.
  22. Для работы с https страницами используйте компоненты THttpClient или TNetHttpClient. Там ssl подключать не нужно, работает из коробки.
  23. Думаю, что можно. Просто для моих целей достаточно общения в пределах одной сети. Единственное, что пока по моей оценке где-то 5% пакетов теряется. Пока не понял почему так.
  24. Сделал простой пример приложения рации в локальной сети под Android. Реализация через UDP. Буду рад, если кому окажется полезным. Для начала/окончания сеанса связи нужно нажать на окружность Для проверки нужно 2 телефона unit Unit5; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, IdGlobal, IdSocketHandle, Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, Androidapi.JNIBridge, AndroidApi.JNI, AndroidApi.Helpers, FMX.Objects, System.Math; type TForm1 = class(TForm) Circle: TCircle; procedure ServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); procedure FormCreate(Sender: TObject); procedure CircleTap(Sender: TObject; const Point: TPointF); end; TSendThread = class(TThread) protected procedure Execute; override; end; var Form1: TForm1; SendThread: TSendThread; Server: TIdUDPServer; audioRecord: JaudioRecord; audiotrack: JAudioTrack; recording: boolean; buffer_Size, port,ch_in, ch_out, format, freq, source: integer; implementation {$R *.fmx} procedure TSendThread.Execute; var buffer: TJavaArray<Byte>; begin buffer := TJavaArray<Byte>.create(buffer_size); while recording do begin audioRecord.read(buffer,0,buffer_size); Server.Broadcast(TIDBytes(TJavaArrayToTBytes(buffer)),port); end; buffer.Free; end; procedure TForm1.CircleTap(Sender: TObject; const Point: TPointF); begin recording:= not recording; if recording then begin Circle.Fill.Color:=TAlphaColors.Red; Server.OnUDPRead:=nil; audiorecord.startRecording; SendThread:=TSendThread.Create; end else begin Circle.Fill.Color:=TAlphaColors.Gray; audiorecord.stop; Server.OnUDPRead:=ServerUDPRead; end; end; procedure TForm1.FormCreate(Sender: TObject); begin buffer_size:=2048; freq:=8000; port:=5555; Server:=TIdUdpServer.Create(Form1); with Server do begin BufferSize:=buffer_size; DefaultPort:=port; BroadCastEnabled:=true; Active:=true; OnUDPRead:=ServerUDPRead; end; Circle.Width:=min(Screen.Width,Screen.Height)*0.7; Circle.Height:=Circle.Width; ch_in:=TJAudioFormat.JavaClass.CHANNEL_IN_MONO; ch_out:=TJAudioFormat.JavaClass.CHANNEL_OUT_MONO; format:=TJAudioFormat.JavaClass.ENCODING_PCM_16BIT; source:=TJMediaRecorder_AudioSource.JavaClass.MIC; audioRecord := TJAudioRecord.JavaClass.init(source, freq, ch_in, format, buffer_size); audiotrack:=TJAudioTrack.JavaClass.init(3, freq, ch_out, format, buffer_size,1); end; procedure TForm1.ServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin audiotrack.write(TBytesToTJavaArray(TBytes(AData)),0,Length(AData)); audiotrack.play; end; end. radio.zip
×
×
  • Создать...