我正在尝试通过firebase_admob将admob集成到我的Flutter应用中。
默认情况下,它似乎只是将横幅广告叠加/堆叠在当前视图的顶部……而没有考虑实际的小部件树及其约束。
我真的不知道为什么有人会那样设计一个库..但是还可以。也许是出于反欺诈的原因?!
为避免用横幅覆盖实际内容,我想在内容中添加填充(填充高度=横幅高度)。
由于我使用的是“智能横幅”,该库会在运行时动态尝试为给定的屏幕尺寸找到最佳的横幅尺寸。
如何找出横幅的尺寸?
答案 0 :(得分:0)
根据Google Specs,这是我用来获取智能横幅高度的代码。
/// The initial size of the banner is calculated on the height of the
/// viewport. Due to ADMob banner refresh policies, in order to have
/// a consistent behaviour, we should keep track of the current AD size
/// and maintain it when the user rotates the screen, and update that
/// value at every banner successful.
/// For now, we will avoid this complexity and set the banner height to
/// the maximum height that a banner could get on this device, forcing
/// the use of the longest side as the base.
/// see https://developers.google.com/admob/android/banner#smart_banners
double _getSmartBannerHeight(BuildContext context) {
MediaQueryData mediaScreen = MediaQuery.of(context);
double dpHeight = mediaScreen.orientation == Orientation.portrait
? mediaScreen.size.height
: mediaScreen.size.width;
log.fine("Device height: $dpHeight");
if (dpHeight <= 400.0) {
return 32.0;
}
if (dpHeight > 720.0) {
return 90.0;
}
return 50.0;
}
正如您所看到的,我不是使用横幅相对于实际设备高度的高度(换句话说,根据设备的方向),而是使用设备的最长边。
之所以这样做,是因为当用户旋转设备时,官方的flutter_admob插件不会重新加载适当的横幅。考虑这种情况: -纵向设备,横幅广告加载50 -用户旋转设备:根据文档,高度应为32,但横幅不会重新加载,高度保持为50 -根据您的广告系列设置,出现了新的横幅广告,提供高度为32的横幅广告 -用户再次旋转设备,依此类推
正如我在评论中指出的那样,有效的解决方案是跟踪最后的横幅大小,并对横幅加载事件做出反应,以便为用户提供无缝的体验。
答案 1 :(得分:0)
在@ mattia-galati的答案中发布的specs中,还有固定高度选项可用。您为什么不使用其中之一?
AdSize.banner , AdSize.largeBanner 等具有固定高度。
仅出于任何特定原因使用 AdSize.smartBanner ?
答案 2 :(得分:0)
您可以使用我的名为 getMargin 的方法,该方法可以计算出显示横幅时所需的填充值,而不会重叠内容,无论手机的高度如何,它都会自动设置正确的填充值。
SmartBanner具有三个高度: 32 | 50 | 90 我的方法计算手机的高度并设置正确的值+ 5。
double getMargin(double height){
double margin;
if(height <= 400){
margin = 37;
} else if(height >= 400 && height < 720){
margin = 55;
} else if(height >= 720){
margin = 95;
}
return margin;
}
示例:
double screenHeight = MediaQuery.of(context).size.height;
Container(
height: EdgeInsets.fromLTRB(bottom: getMargin(height))
)
此外,您可以像我一样将其添加到一个单独的类中,并使该方法静态以从那里调用。
class Ads {
static double getMargin(double height){
double margin;
if(height <= 400){
margin = 37;
} else if(height >= 400 && height < 720){
margin = 55;
} else if(height >= 720){
margin = 95;
}
return margin;
}
示例:
double screenHeight = MediaQuery.of(context).size.height;
Container(
height: EdgeInsets.fromLTRB(bottom: Ads.getMargin(height))
)