如何获得智能横幅的横幅大小?

时间:2018-06-19 19:49:38

标签: android firebase dart admob flutter

我正在尝试通过firebase_admob将admob集成到我的Flutter应用中。

默认情况下,它似乎只是将横幅广告叠加/堆叠在当前视图的顶部……而没有考虑实际的小部件树及其约束。

我真的不知道为什么有人会那样设计一个库..但是还可以。也许是出于反欺诈的原因?!

为避免用横幅覆盖实际内容,我想在内容中添加填充(填充高度=横幅高度)。

由于我使用的是“智能横幅”,该库会在运行时动态尝试为给定的屏幕尺寸找到最佳的横幅尺寸。

如何找出横幅的尺寸?

3 个答案:

答案 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))
)