Alex7wrt
-
Постов
508 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Активность репутации
-
Alex7wrt получил реакцию от HyperZen в Android. Форма не на весь экран по вертикали.
Уточнение: после обновления до 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) -->
-
Alex7wrt получил реакцию от MrAnderson в Вопрос "События OnClick в MyClass"
В первом примере, когда создаете наследника какого-либо класса (в вашем случае TObject), не забывайте наследовать параметры от родительского класса и переопределять базовые методы
Constructor Create(NewId:integer;NewNGP:string); overload;
constructor MyType.Create(NewId:integer;NewNGP:string); Var RectForButt:TRectangle; begin inherited Create; ......
-
Alex7wrt отреагировална dnekrasov в TAlphaTrackBar - Настройка цвета.
Примерно так:
var cl: TAlphaColor; begin cl := Rectangle1.Fill.Color; TAlphaColorRec(cl).A := Round(AlphaTrackBar1.Value * 255); Rectangle1.Fill.Color := cl; end;
-
Alex7wrt получил реакцию от Евгений Корепов в Исправление отображения Smart Banner, Android
Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается Smart Banner (TBannerAD.Size = Auto). Оказалось, что причиной тому неверный расчет высоты баннера в исходниках FMX.Advertising.Android.
Может быть, эта информация кому-нибудь поможет
В документации Android высота баннера должна вычисляться так:
Тогда как в коде FMX.Advertising.Android она вычисляется в процедуре UpdateControlMetrics следующим образом:
const AdHeightPortrait = 90; AdHeightLandscape = 90; AdHeightPhonePortrait = 50; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then if Screen.Size.Width < AndroidSW600DP then FAdControl.Height := AdHeightPhonePortrait else FAdControl.Height := AdHeightPortrait else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; Также, учитывая, что на вытянутых экранах (по крайней мере на тех устройствах, на которых я тестил), Screen.Width и Screen.Height далеко не всегда дают верные значения, то более правильный код процедуры TAndroidBannerAd.UpdateControlMetrics будет таким:
procedure TAndroidBannerAd.UpdateControlMetrics; var Frame: TRectF; Form: TCommonCustomForm; Disp: JDisplayMetrics; Window: JWindow; h: integer; const AdHeightLandscape = 90; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin Disp := TJDisplayMetrics.Create; Window:=TJWindow.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID); Window.getWindowManager.getDefaultDisplay.getRealMetrics(disp); h:=round(Disp.heightPixels/Disp.density); case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then begin if h <= 400 then FAdControl.Height := 32 else if (h>400) and (h<=720) then FAdControl.Height:=50 else FAdControl.Height := 90 end else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; TBannerAdSize.Small: FAdControl.Height := AdMobBannerHeight; TBannerAdSize.Medium: FAdControl.Height := AdMobFullBannerHeight; TBannerAdSize.Large: FAdControl.Height := AdMobLeaderboardHeight; end; if Screen.ActiveForm <> nil then Form := Screen.ActiveForm else if Application.MainForm <> nil then Form := Application.MainForm else Form := nil; if Form <> nil then begin Frame := WindowHandleToPlatform(Form.Handle).Bounds; FAdControl.Width := Round(Frame.Width); end; end; end;
-
Alex7wrt получил реакцию от #WAMACO в Исправление отображения Smart Banner, Android
Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается Smart Banner (TBannerAD.Size = Auto). Оказалось, что причиной тому неверный расчет высоты баннера в исходниках FMX.Advertising.Android.
Может быть, эта информация кому-нибудь поможет
В документации Android высота баннера должна вычисляться так:
Тогда как в коде FMX.Advertising.Android она вычисляется в процедуре UpdateControlMetrics следующим образом:
const AdHeightPortrait = 90; AdHeightLandscape = 90; AdHeightPhonePortrait = 50; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then if Screen.Size.Width < AndroidSW600DP then FAdControl.Height := AdHeightPhonePortrait else FAdControl.Height := AdHeightPortrait else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; Также, учитывая, что на вытянутых экранах (по крайней мере на тех устройствах, на которых я тестил), Screen.Width и Screen.Height далеко не всегда дают верные значения, то более правильный код процедуры TAndroidBannerAd.UpdateControlMetrics будет таким:
procedure TAndroidBannerAd.UpdateControlMetrics; var Frame: TRectF; Form: TCommonCustomForm; Disp: JDisplayMetrics; Window: JWindow; h: integer; const AdHeightLandscape = 90; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin Disp := TJDisplayMetrics.Create; Window:=TJWindow.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID); Window.getWindowManager.getDefaultDisplay.getRealMetrics(disp); h:=round(Disp.heightPixels/Disp.density); case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then begin if h <= 400 then FAdControl.Height := 32 else if (h>400) and (h<=720) then FAdControl.Height:=50 else FAdControl.Height := 90 end else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; TBannerAdSize.Small: FAdControl.Height := AdMobBannerHeight; TBannerAdSize.Medium: FAdControl.Height := AdMobFullBannerHeight; TBannerAdSize.Large: FAdControl.Height := AdMobLeaderboardHeight; end; if Screen.ActiveForm <> nil then Form := Screen.ActiveForm else if Application.MainForm <> nil then Form := Application.MainForm else Form := nil; if Form <> nil then begin Frame := WindowHandleToPlatform(Form.Handle).Bounds; FAdControl.Width := Round(Frame.Width); end; end; end;
-
Alex7wrt получил реакцию от Barbanel в Исправление отображения Smart Banner, Android
Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается Smart Banner (TBannerAD.Size = Auto). Оказалось, что причиной тому неверный расчет высоты баннера в исходниках FMX.Advertising.Android.
Может быть, эта информация кому-нибудь поможет
В документации Android высота баннера должна вычисляться так:
Тогда как в коде FMX.Advertising.Android она вычисляется в процедуре UpdateControlMetrics следующим образом:
const AdHeightPortrait = 90; AdHeightLandscape = 90; AdHeightPhonePortrait = 50; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then if Screen.Size.Width < AndroidSW600DP then FAdControl.Height := AdHeightPhonePortrait else FAdControl.Height := AdHeightPortrait else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; Также, учитывая, что на вытянутых экранах (по крайней мере на тех устройствах, на которых я тестил), Screen.Width и Screen.Height далеко не всегда дают верные значения, то более правильный код процедуры TAndroidBannerAd.UpdateControlMetrics будет таким:
procedure TAndroidBannerAd.UpdateControlMetrics; var Frame: TRectF; Form: TCommonCustomForm; Disp: JDisplayMetrics; Window: JWindow; h: integer; const AdHeightLandscape = 90; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin Disp := TJDisplayMetrics.Create; Window:=TJWindow.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID); Window.getWindowManager.getDefaultDisplay.getRealMetrics(disp); h:=round(Disp.heightPixels/Disp.density); case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then begin if h <= 400 then FAdControl.Height := 32 else if (h>400) and (h<=720) then FAdControl.Height:=50 else FAdControl.Height := 90 end else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; TBannerAdSize.Small: FAdControl.Height := AdMobBannerHeight; TBannerAdSize.Medium: FAdControl.Height := AdMobFullBannerHeight; TBannerAdSize.Large: FAdControl.Height := AdMobLeaderboardHeight; end; if Screen.ActiveForm <> nil then Form := Screen.ActiveForm else if Application.MainForm <> nil then Form := Application.MainForm else Form := nil; if Form <> nil then begin Frame := WindowHandleToPlatform(Form.Handle).Bounds; FAdControl.Width := Round(Frame.Width); end; end; end;
-
Alex7wrt получил реакцию от Anatoliy в Исправление отображения Smart Banner, Android
Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается Smart Banner (TBannerAD.Size = Auto). Оказалось, что причиной тому неверный расчет высоты баннера в исходниках FMX.Advertising.Android.
Может быть, эта информация кому-нибудь поможет
В документации Android высота баннера должна вычисляться так:
Тогда как в коде FMX.Advertising.Android она вычисляется в процедуре UpdateControlMetrics следующим образом:
const AdHeightPortrait = 90; AdHeightLandscape = 90; AdHeightPhonePortrait = 50; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then if Screen.Size.Width < AndroidSW600DP then FAdControl.Height := AdHeightPhonePortrait else FAdControl.Height := AdHeightPortrait else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; Также, учитывая, что на вытянутых экранах (по крайней мере на тех устройствах, на которых я тестил), Screen.Width и Screen.Height далеко не всегда дают верные значения, то более правильный код процедуры TAndroidBannerAd.UpdateControlMetrics будет таким:
procedure TAndroidBannerAd.UpdateControlMetrics; var Frame: TRectF; Form: TCommonCustomForm; Disp: JDisplayMetrics; Window: JWindow; h: integer; const AdHeightLandscape = 90; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin Disp := TJDisplayMetrics.Create; Window:=TJWindow.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID); Window.getWindowManager.getDefaultDisplay.getRealMetrics(disp); h:=round(Disp.heightPixels/Disp.density); case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then begin if h <= 400 then FAdControl.Height := 32 else if (h>400) and (h<=720) then FAdControl.Height:=50 else FAdControl.Height := 90 end else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; TBannerAdSize.Small: FAdControl.Height := AdMobBannerHeight; TBannerAdSize.Medium: FAdControl.Height := AdMobFullBannerHeight; TBannerAdSize.Large: FAdControl.Height := AdMobLeaderboardHeight; end; if Screen.ActiveForm <> nil then Form := Screen.ActiveForm else if Application.MainForm <> nil then Form := Application.MainForm else Form := nil; if Form <> nil then begin Frame := WindowHandleToPlatform(Form.Handle).Bounds; FAdControl.Width := Round(Frame.Width); end; end; end;
-
Alex7wrt получил реакцию от Anatoliy в альтернатива диалогу
Возможно, проблема в том что в VCL и FMX по-разному реализована работа с окнами. Пока в голову приходят два варианта и оба касаются исходного кода компонентов TFileOpenDialog либо TOpenDialog:
1. В исходниках кода TFileOpenDialog переделать работу с контекстом родительского окна под FMX. Вместо Handle окна использовать WindowHandleToPlatform(Handle).Wnd
2. В исходниках TOpenDialog разрешить нажатие на 'ОК' без выбора файла.
Для этого скопируйте в папку проекта модули, в которых реализован функционал TFileOpenDialog или TOpenDialog и поэкспериментируйте с ними.
-
Alex7wrt получил реакцию от Anatoliy в альтернатива диалогу
Добрый день
Проверил поведение TOpenDialog в своей программе в полноэкранном режиме. При переключении на другие программы и обратно окно диалога никуда не исчезает. Сложно сказать, чем вызвано подобное поведение диалога в вашем случае. Возможно стоит проверить код в обработчиках событий формы.
Также, рекомендую поиграться со свойствами формы BorderStyle, FullScreen, WindowState. В частности, попробуйте BorderStyle = None; FullScreen = true; WindowState = wsMaximized.
-
Alex7wrt получил реакцию от Alisson R Oliveira в Воспроизведение без задержки
var Player: JMediaPlayer; Единожды создаете плеер и готовите файл:
Player:=TJMediaPlayer.Create; Player.setDataSource(StringToJString('Путь_к_файлу')); Player.prepare; И, когда потребуется, запускаете воспроизведение
Player.start; В uses нужно добавить что-то из этого:
FMX.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, Androidapi.JNI.AdMob, Androidapi.JNI.App, Androidapi.JNIBridge, FMX.Advertising, FMX.Platform.Android, Androidapi.JNI.Embarcadero Не помню уже, что именно. Ненужные уберите
-
Alex7wrt получил реакцию от Maka в Воспроизведение без задержки
var Player: JMediaPlayer; Единожды создаете плеер и готовите файл:
Player:=TJMediaPlayer.Create; Player.setDataSource(StringToJString('Путь_к_файлу')); Player.prepare; И, когда потребуется, запускаете воспроизведение
Player.start; В uses нужно добавить что-то из этого:
FMX.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, Androidapi.JNI.AdMob, Androidapi.JNI.App, Androidapi.JNIBridge, FMX.Advertising, FMX.Platform.Android, Androidapi.JNI.Embarcadero Не помню уже, что именно. Ненужные уберите
-
Alex7wrt получил реакцию от Anatoliy в Воспроизведение без задержки
var Player: JMediaPlayer; Единожды создаете плеер и готовите файл:
Player:=TJMediaPlayer.Create; Player.setDataSource(StringToJString('Путь_к_файлу')); Player.prepare; И, когда потребуется, запускаете воспроизведение
Player.start; В uses нужно добавить что-то из этого:
FMX.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, Androidapi.JNI.AdMob, Androidapi.JNI.App, Androidapi.JNIBridge, FMX.Advertising, FMX.Platform.Android, Androidapi.JNI.Embarcadero Не помню уже, что именно. Ненужные уберите
-
Alex7wrt получил реакцию от Barbanel в Размеры формы на разных устройствах
var ScreenService: IFMXScreenService; scale: single; begin if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then scale:=ScreenService.GetScreenScale; end;
Эту фишку придумали не разработчики FireMonkey. Коэффициент масштаба экрана используется и в iOS, и в Android. Введен он для более удобного перевода ПО под новые экраны.
Смысл в том, что оперируя тем же логическим размером экрана, ПО автоматически отрисовывает изображение на другом физическом разрешении.
-
Alex7wrt отреагировална Barbanel в Размеры формы на разных устройствах
Этот код был на этом форуме. Смотрите переменную sScale
if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then begin sScreenSize := ScreenService.GetScreenSize.Round; sScale := ScreenService.GetScreenScale; DeviceInfo.diScreenLogic := FloatS(sScreenSize.x) + ' x ' + FloatS(sScreenSize.y); DeviceInfo.diScreenPhis := FloatS(sScreenSize.x * sScale) + ' x ' + FloatS(sScreenSize.y * sScale); DeviceInfo.diScreenWidth := sScreenSize.x; DeviceInfo.diScreenHeight := sScreenSize.y; DeviceInfo.diScale := sScale; end;
Одно из наших приложений, в архиве чуть побольше фоточек чтобы вы убедились что все действительно хорошо. Ну, заодно и критику от коллег смогу услышать))
PS. не обращайте внимания на язык, так задумано)
приложение делается для школ Германии.
Screens.zip
-
Alex7wrt отреагировална Barbanel в Размеры формы на разных устройствах
Это происходит из-за масштабирования.
В вашем случае, коэффициент масштабирования равен 1.5
По ширине если перемножить 320 на 1.5 как раз получится паспортные 480.
По высоте должно тоже получиться, но у вас скорее всего форма не на полный экран, поэтому сжирается честь места сверху для статусбара и снизу для кнопок назад, домой, и список приложений.
Мне доводилось работать с устройствами на которых были такие коэффициенты
1.5 - древнющий беспонтовый ACER, разрешение экрана не помню
2.0 - ветеран Nexus 4, разрешение 1280х720
3.0 - Huawei p8 lite 2007, разрешение 1920х1080
Со всеми этими устройствами дельфи работает без проблем, масштабирование не приносит сколь-нибудь значимых проблем.
Расскажите, с какой целью?
-
Alex7wrt отреагировална Brovin Yaroslav в Есть ли какая-нибудь возможность вставить тире в package файла AndroidManifest.xml
Нет. Название Java пакета не поддерживает "-" в названии. Только латинские буквы в нижнем и верхнем регистрах, числа и '_'.
https://developer.android.com/guide/topics/manifest/manifest-element?hl=ru#package
-
Alex7wrt получил реакцию от Anatoliy в Реализовать рейтинг
Надеюсь, что в предыдущем посте помог ответить на первую часть вопроса.
Если каждая звезда организована отдельным компонентом, то, соответственно, вы всегда можете узнать по какой звезде был клик и раскрасить все звезды до нее (включительно) в желтый цвет.
Ниже скинул программку для герерации TPathData звезды, может пригодится
star generator.zip
Можно использовать генерируемую строку TPathData, или использовать код
procedure star; var i: byte; a1,a2: single; begin Path.Clear; Path.MoveTo(PointF(0,-r)); a1:=Pi/5-Pi/2; a2:=-Pi/2; for i:=1 to 5 do begin Path.LineTo(PointF((r*cos(Pi/5)-d)*cos(a1+(i-1)*2*Pi/5),(r*cos(Pi/5)-d)*sin(a1+(i-1)*2*Pi/5))); Path.LineTo(PointF(r*cos(i*2*Pi/5+a2),r*sin(i*2*Pi/5+a2))); end; Path.ClosePath; path.Translate(r*cos(Pi/10),r); end; Где R - радиус описанной окружности вокруг звезды. В програме он равен 100. d - Разность радиусов внешней и внутренней окружности согласно рисунка
-
Alex7wrt получил реакцию от Barbanel в Реализовать рейтинг
Да все норм. Мне самому рисунок не очень понравился ))
Рисовал его в ворде года два назад, когда хотел понять, как удобнее рисовать звезду. Когда понял, то рисунок уже не было смысла доводить до ума, так что таким он и остался.
Но вот щас все-таки решил доделать. Исправил изображение )
-
Alex7wrt получил реакцию от Barbanel в Реализовать рейтинг
Надеюсь, что в предыдущем посте помог ответить на первую часть вопроса.
Если каждая звезда организована отдельным компонентом, то, соответственно, вы всегда можете узнать по какой звезде был клик и раскрасить все звезды до нее (включительно) в желтый цвет.
Ниже скинул программку для герерации TPathData звезды, может пригодится
star generator.zip
Можно использовать генерируемую строку TPathData, или использовать код
procedure star; var i: byte; a1,a2: single; begin Path.Clear; Path.MoveTo(PointF(0,-r)); a1:=Pi/5-Pi/2; a2:=-Pi/2; for i:=1 to 5 do begin Path.LineTo(PointF((r*cos(Pi/5)-d)*cos(a1+(i-1)*2*Pi/5),(r*cos(Pi/5)-d)*sin(a1+(i-1)*2*Pi/5))); Path.LineTo(PointF(r*cos(i*2*Pi/5+a2),r*sin(i*2*Pi/5+a2))); end; Path.ClosePath; path.Translate(r*cos(Pi/10),r); end; Где R - радиус описанной окружности вокруг звезды. В програме он равен 100. d - Разность радиусов внешней и внутренней окружности согласно рисунка
-
Alex7wrt получил реакцию от Anatoliy в Реализовать рейтинг
Не совсем понял, какой рейтинг имеется ввиду. Внутренний рейтинг в приложении?
Добавить 5 переменных целочисленного типа, которые будут хранить количество выставленных оценок от 1 до 5.
С помощью TPathData нарисовать звезду.
Создать 5 компонентов TPath и в обработчике OnTap или OnClick каждого увеличивать соответствующую переменную на единицу. И для оценки рейтинга вычислять среднее арифметическое: (a1 + a2*2 + a3*3 + a4*4 + a5*5)/(a1 +a2 +a3 + a4 + a5)
-
Alex7wrt получил реакцию от Tumaso в Реализовать рейтинг
Не совсем понял, какой рейтинг имеется ввиду. Внутренний рейтинг в приложении?
Добавить 5 переменных целочисленного типа, которые будут хранить количество выставленных оценок от 1 до 5.
С помощью TPathData нарисовать звезду.
Создать 5 компонентов TPath и в обработчике OnTap или OnClick каждого увеличивать соответствующую переменную на единицу. И для оценки рейтинга вычислять среднее арифметическое: (a1 + a2*2 + a3*3 + a4*4 + a5*5)/(a1 +a2 +a3 + a4 + a5)
-
Alex7wrt отреагировална Tumaso в Переход на новую модель разрешений
@Alex7wrt,
устанавливают в том числе и новые пользователи на старых версиях андроида, и у них работает. minSdkVersion для этого.
Что касается targetSDK, то этим значением приложение уведомляет операционку, что возможно будет использовать api вплоть до данной версии. targetSDK 27 пока не использовал, только 26, и все что надо работает.
В самом коде делаю анализ текущей версии SDK, и в зависимости от нее возможно делаю дополнительные действия. Вот например, работа с правами:
{$IFDEF ANDROID} // для Android 6+ требуется дополнительная работа с правами if TJBuild_VERSION.JavaClass.SDK_INT >= 23 then begin if (TAndroidHelper.context.checkSelfPermission( StringToJString(PERMISSION_FILE_READ) ) = TJPackageManager.JavaClass.PERMISSION_DENIED) or (TAndroidHelper.context.checkSelfPermission( StringToJString(PERMISSION_FILE_WRITE) ) = TJPackageManager.JavaClass.PERMISSION_DENIED) then begin // необходимо запросить разрешение на использование галереи LIsWaitPermissions := True; TAndroidHelper.Activity.requestPermissions( CreateJavaStringArray([PERMISSION_FILE_READ, PERMISSION_FILE_WRITE]), BUTTON_FILE ); end; end; {$ENDIF}
-
Alex7wrt отреагировална Tumaso в Переход на новую модель разрешений
@Alex7wrt,
конечно смогут. Минимально допустимая версия указывается в minSdkVersion. У меня например во всех приложениях установлено <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="26" />
-
Alex7wrt получил реакцию от Anatoliy в Переход на новую модель разрешений
Добрый день
Знаю, что с ноября в 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. В данном приложении не используются никакие разрешения. Только доступ в интернет
-
Alex7wrt отреагировална Tumaso в Разрешения для приложения не вступают в силу на Android
У делфи большой плюс - кроссплатформенность. У меня реально 90% единого кода для виндов, андроида и иоса. Специфичного для каждой платформы не так и много, по большому счету.
Писать отдельно в андроид студии, отдельно в xcode, отдельно в делфи с VCL реально не очень хочется Заказчикам то пофиг, они хотят как минимум мобильные приложения сразу и для андроида и для иоса.