自動調整橫幅廣告是新一代的回應式廣告,會針對每部裝置調整廣告大小,藉此獲得最佳成效。原本固定大小的橫幅廣告僅支援固定高度,改良後的自動調整橫幅廣告則可讓開發人員指定廣告寬度,從而決定理想的廣告大小。
為了選擇最適合的廣告大小,內嵌式自動調整橫幅廣告採用螢幕的最大高度 (而非固定高度),進而改善成效。
內嵌自動調整橫幅廣告的使用時機
相較於錨定自動調整橫幅廣告,內嵌自動調整橫幅廣告的尺寸更大、高度更高。可調整高度,甚至可與裝置螢幕一樣高。
適合刊登在可捲動內容中,例如:
必要條件
- 請按照入門指南中的操作說明,匯入行動廣告 Flutter 外掛程式。
事前準備
在應用程式中導入自動調整橫幅廣告時,請注意下列事項:
請確認您使用的是最新版的 Google Mobile Ads SDK,以及最新版的中介服務轉接程式 (如果使用中介服務)。
內嵌自動調整橫幅廣告的尺寸設計,可在使用可用寬度的情況下發揮最佳效能。在大多數情況下,這會是所用裝置畫面的完整寬度。請務必考量適用的安全區域。
取得廣告大小的方法如下:
AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)
AdSize.getLandscapeInlineAdaptiveBannerAdSize(int width)
AdSize.getPortraitInlineAdaptiveBannerAdSize(int width)
AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight)
使用內嵌式自適應橫幅 API 時,Google Mobile Ads SDK 會傳回具有指定寬度和內嵌標記的
AdSize
。高度為零或maxHeight
,視您使用的 API 而定。廣告的實際高度會在傳回時提供。內嵌自動調整橫幅廣告適合置於可捲動內容中。橫幅廣告的高度可與裝置螢幕一樣高,或受限於最大高度,具體取決於 API。
實作
導入簡易內嵌式自動調整橫幅廣告的步驟如下:
- 取得內嵌自動調整橫幅廣告尺寸。您取得的尺寸會用於請求自動調整橫幅廣告。如要取得自動調整廣告尺寸,請務必完成下列操作:
- 取得所用裝置的寬度 (以密度無關像素為單位),或者,如果您不想使用畫面的完整寬度,請自行設定需要的寬度。您可以使用
MediaQuery.of(context)
取得螢幕寬度。 - 針對廣告尺寸類別使用適當的靜態方法 (例如
AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)
),取得目前螢幕方向的內嵌式自動調整AdSize
物件。 - 如果您想限制橫幅的高度,可以使用靜態方法
AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight)
。
- 取得所用裝置的寬度 (以密度無關像素為單位),或者,如果您不想使用畫面的完整寬度,請自行設定需要的寬度。您可以使用
- 使用廣告單元 ID、自動調整廣告大小和廣告要求物件,建立
BannerAd
物件。 - 載入廣告。
- 在
onAdLoaded
回呼中,使用BannerAd.getPlatformAdSize()
取得更新的平台廣告大小,並更新AdWidget
容器高度。
程式碼範例
以下是載入內嵌自動調整橫幅的範例小工具,可配合螢幕寬度調整,並考量內嵌的部分:
import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
/// This example demonstrates inline adaptive banner ads.
///
/// Loads and shows an inline adaptive banner ad in a scrolling view,
/// and reloads the ad when the orientation changes.
class InlineAdaptiveExample extends StatefulWidget {
@override
_InlineAdaptiveExampleState createState() => _InlineAdaptiveExampleState();
}
class _InlineAdaptiveExampleState extends State<InlineAdaptiveExample> {
static const _insets = 16.0;
BannerAd? _inlineAdaptiveAd;
bool _isLoaded = false;
AdSize? _adSize;
late Orientation _currentOrientation;
double get _adWidth => MediaQuery.of(context).size.width - (2 * _insets);
@override
void didChangeDependencies() {
super.didChangeDependencies();
_currentOrientation = MediaQuery.of(context).orientation;
_loadAd();
}
void _loadAd() async {
await _inlineAdaptiveAd?.dispose();
setState(() {
_inlineAdaptiveAd = null;
_isLoaded = false;
});
// Get an inline adaptive size for the current orientation.
AdSize size = AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(
_adWidth.truncate());
_inlineAdaptiveAd = BannerAd(
// TODO: replace this test ad unit with your own ad unit.
adUnitId: 'ca-app-pub-3940256099942544/9214589741',
size: size,
request: AdRequest(),
listener: BannerAdListener(
onAdLoaded: (Ad ad) async {
print('Inline adaptive banner loaded: ${ad.responseInfo}');
// After the ad is loaded, get the platform ad size and use it to
// update the height of the container. This is necessary because the
// height can change after the ad is loaded.
BannerAd bannerAd = (ad as BannerAd);
final AdSize? size = await bannerAd.getPlatformAdSize();
if (size == null) {
print('Error: getPlatformAdSize() returned null for $bannerAd');
return;
}
setState(() {
_inlineAdaptiveAd = bannerAd;
_isLoaded = true;
_adSize = size;
});
},
onAdFailedToLoad: (Ad ad, LoadAdError error) {
print('Inline adaptive banner failedToLoad: $error');
ad.dispose();
},
),
);
await _inlineAdaptiveAd!.load();
}
/// Gets a widget containing the ad, if one is loaded.
///
/// Returns an empty container if no ad is loaded, or the orientation
/// has changed. Also loads a new ad if the orientation changes.
Widget _getAdWidget() {
return OrientationBuilder(
builder: (context, orientation) {
if (_currentOrientation == orientation &&
_inlineAdaptiveAd != null &&
_isLoaded &&
_adSize != null) {
return Align(
child: Container(
width: _adWidth,
height: _adSize!.height.toDouble(),
child: AdWidget(
ad: _inlineAdaptiveAd!,
),
));
}
// Reload the ad if the orientation changes.
if (_currentOrientation != orientation) {
_currentOrientation = orientation;
_loadAd();
}
return Container();
},
);
}
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text('Inline adaptive banner example'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: _insets),
child: ListView.separated(
itemCount: 20,
separatorBuilder: (BuildContext context, int index) {
return Container(
height: 40,
);
},
itemBuilder: (BuildContext context, int index) {
if (index == 10) {
return _getAdWidget();
}
return Text(
'Placeholder text',
style: TextStyle(fontSize: 24),
);
},
),
),
));
@override
void dispose() {
super.dispose();
_inlineAdaptiveAd?.dispose();
}
}