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

Alex7wrt

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

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

  • Посещение

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

    31

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

  1. Не совсем понял, какой рейтинг имеется ввиду. Внутренний рейтинг в приложении? Добавить 5 переменных целочисленного типа, которые будут хранить количество выставленных оценок от 1 до 5. С помощью TPathData нарисовать звезду. Создать 5 компонентов TPath и в обработчике OnTap или OnClick каждого увеличивать соответствующую переменную на единицу. И для оценки рейтинга вычислять среднее арифметическое: (a1 + a2*2 + a3*3 + a4*4 + a5*5)/(a1 +a2 +a3 + a4 + a5)
  2. Спасибо за ответ. Правильно ли я вас понял, что ваши приложения с TargetSDK 26 именно устанавливают новые пользователи с Android 5.1 и ниже, а не обновляют уже установленное приложение? И как насчет TargetSDK 26 или 27 - будет ли разница в этом плане?
  3. Добрый день Знаю, что с ноября в Google Play можно обновлять приложения только для TargetSDK не ниже 26. Но до этого момента этой функцией я не пользовался, оставляя в Манифесте все по дефолту, то есть и minSDK и targetSDK равны 14. Понятно, что от этого никуда не уйти, но в связи с этим меня больше всего интересует вопрос, если я обновлю приложение с targetSDK равным 26 или 27, смогут ли это приложение установить новые пользователи? При загрузке версии в Google Play появляется предупреждение, но из него ответ конкретно на мой вопрос не ясен. На данный момент около 25% пользователей, ежедневно устанавливающих данное приложение, имеют SDK 22 (Android 5.1) и ниже. И меня интересует, смогут ли такие пользователи устанавливать версию приложения, если я обновлю его до targetSDK 26 или 27? И также, есть ли разница, если выставить targetSDK 26 или 27? P.S. В данном приложении не используются никакие разрешения. Только доступ в интернет
  4. Такого обработчика нет. Можете написать аналогично обработчику OnResize в FMX.Controls.pas. Для этого в тех методах, которые вызывают изменение положения контрола, нужно проставить соответствующие маркеры, чтобы менять значение свойства типа: property OnChangePosition: TNotifyEvent read FOnChangePosition write FOnChangePosition;
  5. Уточнение: после обновления до MIUI 10 снова появилась черная полоса снизу. При этом в сторонних приложениях ее не наблюдалось. Следовательно, приведенное выше решение неполноценно. Решение: добавить строку android:resizeableActivity="true" в секцию Activity <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%"> <%application-meta-data%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:resizeableActivity="true" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <meta-data android:name="android.max_aspect" android:value="2.1" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  6. Так происходит потому что вы делаете проверку с помощью ShowMessage. При этом панель теряет фокус и любое движение мыши над ней снова вызывает OnMouseEnter. Проверяйте так: добавьте на форму компонент TText и в обработчике панели OnMouseEnter напишите: text1.Text:=text1.Text+#13+'asdasd'; Вы увидите, что событие срабатывает корректно
  7. Да. Вот мой манифест: <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-feature android:glEsVersion="0x00020000" android:required="True"/> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%"> <%application-meta-data%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <meta-data android:name="android.max_aspect" android:value="2.1" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  8. Хм... Создал пустой проект, добавил эту строку - приложение на весь экран,убрал строку - чёрная полоса снизу. Пока не пойму,почему у вас не получается
  9. Файлы проекта находятся в той же папке, что и AndroidManifest.template.xml?
  10. Для того, чтобы работало "из коробки", добавьте в файле манифеста в секции Activity строку: <meta-data android:name="android.max_aspect" android:value="2.1" /> Где 2.1 -максимальное соотношение сторон, поддерживаемое приложением. Можно заменить другим числом
  11. У меня была похожая ситуация с Redmi 5 и Redmi Note 5 Попробуйте зайти на телефоне в Настройки - > Безграничный экран - > Полноэкранный режим, и активировать полноэкранный режим для этого приложения
  12. Alex7wrt

    ListView, сброс SearchBox

    Добрый день Использую ListView.SearchBox для фильтра текста итемов. При первом использовании все норм. Но если после первого использования заменить тексты итемов, то поиск работает уже некорректно, то есть не находит итемы, которые содержат вводимый в SearchBox текст. Что нужно сделать, чтобы после замены текстов у итемов в ListView поиск через SearchBox всегда работал корректно? Может быть, какой-то сброс или что-то типа того? Заранее спасибо Rad Studio 10.1.2
  13. На Xiaomi "Now" выдает правильное время. Посмотрите в настройках телефона параметр "Регион"
  14. Используйте TCPServer/TCPClient Для отправки по TCP. Там принцип работы тот же, многие методы/свойства идентичны. У меня все работает на всех платформах Прием данных в TCPServer делайте в OnExecute. В TCPClient для приема используйте поток: procedure TTCPConnectThread.Execute; begin while not Terminated do begin try if TCPClient.Connected then begin //Здесь считываем данные, например с помощью TCPClient.IOHandler.ReadLn, и обрабатываем их end; finally sleep(100); end; end; end;
  15. Уважаемый X11, пожалуйста, не вводите людей в заблуждение. По теме обязательного использования последних API на форуме уже есть несколько тем. С августа разрешена публикация новых приложений только с API не ниже 26 (Android 8.0), а с ноября для обновлений. Для того, чтобы приложение соответствовало новым требованиям, в файле мвнифеста нужно поменять параметр TargetSDKVersion на 26 или выше. Google никого банить не будет. Приложение просто не пропустят на публикацию. Уже сейчас при размещении в Google Play приложения с более ранней версией SDK, появляется предупреждение, что скоро публиковать можно только с SDK 26 и выше. Существующие же приложения никто трогать не будет.
  16. Alex7wrt

    PopUp и Canvas

    Можете сами рисовать PopUp на той же канве. Любой формы, цвета и т.д. По событиям мыши переприсваивать булевы переменные показать/скрыть PopUp, по координатам курсора определять над каким Item находится курсор мыши и т.д. Да, это более длинный подход, зато более универсальный.
  17. Полностью согласен с Krapotkin. Выделять отдельный поток только для создания визуальных компонентов не имеет смысла, так как синхронизацией вы все равно создаете их в главном потоке. Поток нужен для работы с данными или невизуальными компонентами, например THTTPClient, UDP, TCP и т.д. К примеру, вот вариант загрузки картинок по http: procedure TInitThread.Execute; var HTTP: THTTPClient; Stream: TStringStream; i: shortint; success: boolean; begin try try HTTP:=THTTPClient.Create; Stream:= TStringStream.Create('',TEncoding.ANSI); HTTP.Get('адрес www', stream); Stream.Position:=0; names.LoadFromStream(Stream); i:=names.Count; while i>0 do begin try setlength(images,length(images)+1); images[length(images)-1]:=TBitMap.Create; Stream.Clear; HTTP.Get('адрес www'+names[i-1]+'.png',Stream); Stream.Position:=0; Synchronize(procedure begin images[length(images)-1].LoadFromStream(Stream); end); except images[length(images)-1]:=noname; end; names.Delete(i-1); i:=i-2; end; success:=true; except names.Clear; success:=false; end; finally HTTP.Free; Stream.Free; end; end; Пример может немного корявый, но из него видно, что синхронизация используется только для загрузки данных в Bitmap, (и то потому что это код под 10.1 Berlin. Начиная с версии 10.2 битмапы тоже можно загружать в потоке), все остальное в синхронизации не нуждается. Прошу прощения за небольшой оффтоп (хотя это можно отнести к вопросу № 3), но как вы делаете переключение фреймов свайпом? Очень интересно
  18. По моему, все равно. Как вам удобнее. Я так понимаю, что TTask разработаны с прицелом на параллельные вычисления, когда нужно выполнять однотипные операции в нескольких потоках. Для этого дела там имеются опции по ожиданию выполнения остальных потоков и т.д. TTask также удобен тем, что его можно сразу использовать, не нужно объявлять поток. TThread удобен, если нужно выполнить определенный набор действий по завершению потока (с помошью OnTerminate). Может и в TTask такое есть, не знаю Лично я просто привык использовать TThread
  19. Дело в том, что индикатор отрисовывается в основном потоке. По видимому ваша процедура также выполняется в основном потоке. Чтобы не было подтормаживаний, выполняйте фоновые операции в отдельном потоке, а при необходимости отрисовать какой-нибудь визуальный компонент, пользуйтесь Synchronize или Queue.
  20. Alex7wrt

    TMotionSensor

    Подтверждаю Раньше никогда не работал с сенсорами. И вот сразу обнаружил эту неприятную особенность на некоторых телефонах. На Xiaomi Redmi 3S все работает отлично, но на Samsung Galaxy S7 Edge (который по идее супер нафарширован сенсорами) что акселерометр, что гироскоп выдает сплошные нули. Другие приложения из Google Play типа "Уровень" или "Компас" работают понятное дело отлично, а собранное в FMX - Нет. ((( По комментарию выше подозреваю что проблема с самсунгами. Но ведь сторонние приложения работают. В чем же может быть причина? Хотя судя по тому, что это единственная тема на форуме по датчикам движения, подозреваю, что ответ вряд ли получу )) Но хоть для истории коммент останется unit uMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms3D, FMX.Forms, FMX.Dialogs, System.Sensors, FMX.Controls3D, FMX.Objects3D, FMX.StdCtrls, FMX.Layers3D, FMX.MaterialSources, FMX.Types3D, System.Math.Vectors, FMX.Controls.Presentation; type TGyroscopeForm = class(TForm3D) Rectangle3D1: TRectangle3D; Timer1: TTimer; LightMaterialSource1: TLightMaterialSource; Light1: TLight; Layer3D1: TLayer3D; Label1: TLabel; procedure Timer1Timer(Sender: TObject); procedure Form3DCreate(Sender: TObject); end; var GyroscopeForm: TGyroscopeForm; FSensor1: TCustomOrientationSensor; FSensors: TSensorArray; FSensorManager: TSensorManager; implementation {$R *.fmx} {$R *.LgXhdpiPh.fmx ANDROID} procedure TGyroscopeForm.Form3DCreate(Sender: TObject); var Sensor: TCustomSensor; begin { attempt to get and activate the sensor manager } FSensorManager := TSensorManager.Current; FSensorManager.Activate; FSensors := TSensorManager.Current.GetSensorsByCategory(TSensorCategory.Orientation); FSensor1 := nil; for Sensor in FSensors do if TCustomOrientationSensor(Sensor).SensorType = TOrientationSensorType.Inclinometer3D then begin FSensor1 := TCustomOrientationSensor(Sensor); Break; end; if not Assigned(FSensor1) then begin Label1.Text := 'Gyro not found'; Exit; end; if not FSensor1.Started then begin FSensor1.Start; Timer1.Enabled := True; end; end; procedure TGyroscopeForm.Timer1Timer(Sender: TObject); begin { check for sensor assignment } if Length(FSensors) > 0 then if Assigned(FSensor1) then begin Rectangle3D1.RotationAngle.X := FSensor1.TiltX; Rectangle3D1.RotationAngle.Y := FSensor1.TiltY; Rectangle3D1.RotationAngle.Z := FSensor1.TiltZ; Label1.Text := Format('Gyro: %3.1f %3.1f %3.1f',[Rectangle3D1.RotationAngle.X, Rectangle3D1.RotationAngle.Y, Rectangle3D1.RotationAngle.Z]); end; end; end.
×
×
  • Создать...