Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается 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
Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается 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;
Ссылка на комментарий
0 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.