إعلانات البانر التكيُّفية هي الجيل التالي من الإعلانات المتجاوبة، وهي تحقّق أفضل قياس للأداء من خلال تحسين حجم الإعلان لكل جهاز. على عكس إعلانات البانر التي تتضمّن حجمًا ثابتًا والتي تتيح الارتفاعات الثابتة فقط، تتيح إعلانات البانر التكيُّفية للمطوّرين تحديد عرض الإعلان واستخدامه لتحديد الحجم الأمثل للإعلان.
ولاختيار أفضل حجم للإعلان، تستخدم إعلانات البانر التكيُّفية المضمّنة الارتفاعات القصوى بدلاً من الارتفاعات الثابتة. ويؤدي ذلك إلى فرص لتحسين الأداء.
حالات استخدام إعلانات البانر التكيُّفية المضمّنة
إعلانات البانر التكيّفية المضمّنة هي إعلانات بانر أكبر وأطول مقارنةً بإعلانات البانر التكيّفية الثابتة. فهي ذات ارتفاع متغير، ويمكن أن يصل طولها إلى نفس شاشة الجهاز.
ويتم وضعها في المحتوى الذي يمكن التمرير فيه، على سبيل المثال:
المتطلبات الأساسية
- اتّبِع التعليمات الواردة في دليل البدء حول كيفية استيراد المكوّن الإضافي Flutter لإعلانات الأجهزة الجوّالة.
قبل البدء
عند تنفيذ إعلانات البانر التكيُّفية في تطبيقك، يُرجى ملاحظة النقاط التالية:
تأكَّد من استخدام أحدث إصدار من حزمة "SDK لإعلانات Google على الأجهزة الجوّالة"، وإذا كنت تستخدم التوسّط، استخدم أحدث إصدارات محوّلات التوسّط.
تم تصميم أحجام إعلانات البانر التكيُّفية المضمّنة لتقديم أفضل أداء عند استخدام العرض الكامل المتاح. وفي معظم الحالات، سيكون هذا هو العرض الكامل لشاشة الجهاز المستخدَم. احرص على مراعاة المناطق الآمنة السارية.
إن طرق الحصول على حجم الإعلان هي
AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)
AdSize.getLandscapeInlineAdaptiveBannerAdSize(int width)
AdSize.getPortraitInlineAdaptiveBannerAdSize(int width)
AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight)
عند استخدام واجهات برمجة التطبيقات لإعلانات البانر التكيُّفية المضمّنة، تعرِض حزمة "SDK لإعلانات Google على الأجهزة الجوّالة"
AdSize
بالعرض المحدّد وبعلامة مضمّنة. يكون الارتفاع إما صفرًا أوmaxHeight
، وذلك استنادًا إلى واجهة برمجة التطبيقات التي تستخدمها. يصبح الارتفاع الفعلي للإعلان متاحًا عند إرجاعه.تم تصميم إعلان بانر تكيُّفي مضمّن ليتم وضعه في محتوى قابل للتمرير. يمكن أن يكون ارتفاع إعلان البانر بقدر شاشة الجهاز أو محدودًا بحد أقصى للارتفاع، وذلك تبعًا لواجهة برمجة التطبيقات.
التنفيذ
اتّبِع الخطوات التالية لعرض بانر بسيط متوافق مع جميع الأجهزة.
- احصل على حجم إعلان بانر تكيُّفي مضمّن. سيتم استخدام الحجم الذي تحصل عليه ل
طلب إعلان البانر التكيُّفي. للحصول على حجم الإعلان التكيُّفي، تأكَّد من أنّك:
- احصل على عرض الجهاز المستخدَم بوحدات بكسل مستقلة عن الكثافة، أو اضبط
العرض الذي تريده إذا كنت لا تريد استخدام العرض الكامل للشاشة.
يمكنك استخدام
MediaQuery.of(context)
للحصول على عرض الشاشة. - استخدِم الطرق الثابتة المناسبة في فئة حجم الإعلان، مثل
AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)
للحصول على كائنAdSize
متوافق مضمّن للاتجاه الحالي. - إذا أردت الحدّ من ارتفاع البانر، يمكنك استخدام الطريقة الثابتة
AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight)
.
- احصل على عرض الجهاز المستخدَم بوحدات بكسل مستقلة عن الكثافة، أو اضبط
العرض الذي تريده إذا كنت لا تريد استخدام العرض الكامل للشاشة.
يمكنك استخدام
- أنشئ عنصرًا من النوع
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();
}
}