Адаптивные баннеры — это следующее поколение адаптивной рекламы, максимизирующее производительность за счет оптимизации размера рекламы для каждого устройства. Улучшая баннеры фиксированного размера, которые поддерживали только фиксированную высоту, адаптивные баннеры позволяют разработчикам указывать ширину рекламы и использовать ее для определения оптимального размера рекламы.
Чтобы выбрать лучший размер рекламы, встроенные адаптивные баннеры используют максимальную высоту вместо фиксированной. Это дает возможности для улучшения производительности.
Когда использовать встроенные адаптивные баннеры
Встроенные адаптивные баннеры — это более крупные и высокие баннеры по сравнению с закрепленными адаптивными баннерами. Они имеют переменную высоту и могут быть такими же высокими, как экран устройства.
Они предназначены для размещения в прокручиваемом контенте, например:
Предпосылки
- Следуйте инструкциям из руководства по началу работы по импорту плагина 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)
.
- Получите ширину используемого устройства в пикселях, независимых от плотности, или задайте собственную ширину, если вы не хотите использовать всю ширину экрана. Вы можете использовать
- Создайте объект
AdManagerBannerAd
с идентификатором вашего рекламного блока, размером адаптивного объявления и объектом запроса объявления. - Загрузите объявление.
- В обратном вызове
onAdLoaded
используйтеAdManagerBannerAd.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;
AdManagerBannerAd? _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 = AdManagerBannerAd(
// TODO: replace with your own ad unit.
adUnitId: '/21775744923/example/adaptive-banner',
size: size,
request: AdManagerAdRequest(),
listener: AdManagerBannerAdListener(
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.
AdManagerBannerAd bannerAd = (ad as AdManagerBannerAd);
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();
}
}