アダプティブ バナーは次世代のレスポンシブ広告で、デバイスごとに広告サイズを最適化して広告のパフォーマンスを最大限に高めます。アダプティブ バナーでは、高さが固定されているスマートバナーに加えて、広告の幅を指定して最適な広告サイズを判断できます。
最適な広告サイズが選択されるように、アダプティブ バナーでは固定の高さではなく、固定のアスペクト比が使用されます。これにより、どのデバイスでも、バナー広告が画面のより一貫した部分を占めるようになり、パフォーマンスの向上につながります。
アダプティブ バナーを使用する場合、特定のデバイスと幅に対して常に一定のサイズが返されます。特定のデバイスでレイアウトをテストした後、広告サイズが変更されていないことを確認できます。ただし、バナー クリエイティブのサイズはデバイスによって異なる場合があります。そのため、広告の高さのばらつきに対応するレイアウトにすることをおすすめします。まれに、アダプティブ サイズ全体が表示されないことがあります。その場合は、標準サイズのクリエイティブがこのスロットの中央に配置されます。
前提条件
- スタートガイドの手順に沿って、Mobile Ads Flutter プラグインをインポートします。
アダプティブ バナーを使用するタイミング
アダプティブ バナーは、業界標準の 320×50 のバナーサイズと、それに優先するスマートバナー フォーマットの代替として設計されています。
このサイズのバナーは一般に、画面の上部または下部に固定されるアンカーバナーとして使用されます。
このようなアンカー型バナーのアダプティブ バナーのアスペクト比は、標準の 320×50 の広告とほぼ同じになります(以下の 3 つの例をご覧ください)。
320×50 バナー |
アダプティブ バナー |
スマートバナー |
アダプティブ バナーでは、利用可能な画面サイズが最大限に活用されています。また、スマートバナーと比較して、アダプティブ バナーは以下の点で優れています。
強制的に全画面表示するのではなく、指定した任意の幅が使用されるため、iOS ではセーフエリア、Android ではディスプレイ カットアウトを考慮できます。
さまざまなサイズのデバイスで高さを一定にするのではなく、デバイスごとに最適な高さを選択することで、デバイスの断片化の影響を軽減できます。
実装上の注意
アプリにアダプティブ バナーを実装する際は、以下の点に留意してください。
- 広告が配置されるビューの幅は把握している必要があります。デバイスの幅と、セーフエリアやカットアウト(該当する場合)を考慮する必要があります。
- 広告スロットを埋めない小さな広告サイズを配信する場合は、AdMob のポリシーに準拠するよう広告ビューの背景を不透明にしてください。
- Google Mobile Ads Flutter プラグインの最新バージョンを使用していることを確認します。
- アダプティブ バナーは、横幅いっぱいにしておくと最大限の成果が得られるように設計されています。ほとんどの場合、これは使用中のデバイスの画面の全幅になります。該当するセーフエリアを必ず考慮してください。
- アダプティブ AdSize API を使用している場合、Google Mobile Ads SDK により、指定された幅に対して最適化された広告の高さでバナーのサイズが設定されます。
- アダプティブ バナーの広告サイズを取得するには 2 つの方法があります。特定の向きをリクエストする場合の
AdSize.getAnchoredAdaptiveBannerAdSize(Orientation orientation, int width)
と、実行時の現在の向きをリクエストする場合のAdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(int width)
です。 - 特定のデバイスで特定の幅に対して返されるサイズは常に同じであるため、特定のデバイスでレイアウトをテストした後は、広告サイズが変化しないことを確認できます。
- アンカー型バナーの高さは、デバイスの高さの 15% 以下、または密度非依存ピクセル 90 ピクセル以上、密度非依存ピクセル 50 以上となります。
クイックスタート
シンプルなアンカー アダプティブ バナーを実装する手順は次のとおりです。
- アダプティブ バナー広告のサイズを取得します。取得したサイズは、アダプティブ バナーのリクエストに使用されます。アダプティブ バナーの広告サイズを取得するには、以下の操作を行います。
- 使用するデバイスの幅を密度非依存ピクセルで取得します。画面の全幅を使用しない場合は独自の幅を設定します。
MediaQuery.of(context)
を使用すると画面の幅を取得できます。 - 現在の向きに対応するアダプティブな
AdSize
オブジェクトを取得するには、AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(int width)
などの広告サイズクラスに対して適切な静的メソッドを使用します。
- 使用するデバイスの幅を密度非依存ピクセルで取得します。画面の全幅を使用しない場合は独自の幅を設定します。
- 広告ユニット ID、アダプティブな広告サイズ、広告リクエスト オブジェクトを指定した
BannerAd
オブジェクトを作成します。 - 通常のバナー広告と同じように広告を読み込み、通常の広告ビューの場合と同様に
AdWidget
から表示します。
サンプルコード
画面の幅に合わせてアンカー アダプティブ バナーを読み込むウィジェットの例を次に示します。
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
/// This example demonstrates anchored adaptive banner ads.
class AnchoredAdaptiveExample extends StatefulWidget {
@override
_AnchoredAdaptiveExampleState createState() =>
_AnchoredAdaptiveExampleState();
}
class _AnchoredAdaptiveExampleState extends State<AnchoredAdaptiveExample> {
BannerAd? _anchoredAdaptiveAd;
bool _isLoaded = false;
@override
void didChangeDependencies() {
super.didChangeDependencies();
_loadAd();
}
Future<void> _loadAd() async {
// Get an AnchoredAdaptiveBannerAdSize before loading the ad.
final AnchoredAdaptiveBannerAdSize? size =
await AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(
MediaQuery.of(context).size.width.truncate());
if (size == null) {
print('Unable to get height of anchored banner.');
return;
}
_anchoredAdaptiveAd = BannerAd(
// TODO: replace these test ad units with your own ad unit.
adUnitId: Platform.isAndroid
? 'ca-app-pub-3940256099942544/6300978111'
: 'ca-app-pub-3940256099942544/2934735716',
size: size,
request: AdRequest(),
listener: BannerAdListener(
onAdLoaded: (Ad ad) {
print('$ad loaded: ${ad.responseInfo}');
setState(() {
// When the ad is loaded, get the ad size and use it to set
// the height of the ad container.
_anchoredAdaptiveAd = ad as BannerAd;
_isLoaded = true;
});
},
onAdFailedToLoad: (Ad ad, LoadAdError error) {
print('Anchored adaptive banner failedToLoad: $error');
ad.dispose();
},
),
);
return _anchoredAdaptiveAd!.load();
}
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text('Anchored adaptive banner example'),
),
body: Center(
child: Stack(
alignment: AlignmentDirectional.bottomCenter,
children: <Widget>[
ListView.separated(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
itemBuilder: (context, index) {
return Text(
'Placeholder text',
style: TextStyle(fontSize: 24),
);
},
separatorBuilder: (context, index) {
return Container(height: 40);
},
itemCount: 20),
if (_anchoredAdaptiveAd != null && _isLoaded)
Container(
color: Colors.green,
width: _anchoredAdaptiveAd!.size.width.toDouble(),
height: _anchoredAdaptiveAd!.size.height.toDouble(),
child: AdWidget(ad: _anchoredAdaptiveAd!),
)
],
),
),
);
@override
void dispose() {
super.dispose();
_anchoredAdaptiveAd?.dispose();
}
}
ここでは、AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize
関数を使用して、現在の画面の向きで固定された位置のバナーのサイズを取得しています。特定の向きのアンカーバナーをプリロードするには、AdSize.getAnchoredAdaptiveBannerAdSize(Orientation orientation, int width)
を使用して希望の向きを渡します。