Wbudowane banery adaptacyjne

Banery adaptacyjne to następna generacja reklam elastycznych, która maksymalizuje skuteczność przez optymalizację rozmiaru reklamy dla każdego urządzenia. Ulepszyliśmy banery o stałym rozmiarze, które obsługiwały tylko stałe wysokości, i umożliwiły deweloperom określanie szerokości reklamy i wykorzystywanie jej do określenia optymalnego rozmiaru reklamy.

Aby wybrać najlepszy rozmiar reklamy, wbudowane banery adaptacyjne używają wartości maksymalnych zamiast stałych. Daje to możliwość poprawy skuteczności.

Kiedy używać wbudowanych banerów adaptacyjnych

Wbudowane banery adaptacyjne są większe i wyższe w porównaniu do zakotwiczonych banerów adaptacyjnych. Mają zmienną wysokość, a ich wysokość może sięgać ekranu urządzenia.

Są one przeznaczone do umieszczania w treściach przewijanych, na przykład:

Wymagania wstępne

Zanim zaczniesz

Implementując banery adaptacyjne w aplikacji, pamiętaj o tych kwestiach:

  • Upewnij się, że używasz najnowszej wersji pakietu SDK do reklam mobilnych Google, a jeśli korzystasz z zapośredniczenia – najnowszych wersji adapterów zapośredniczenia.

  • Rozmiary wbudowanych banerów adaptacyjnych zostały zaprojektowane tak, aby działały najlepiej przy korzystaniu z pełnej dostępnej szerokości. W większości przypadków będzie to pełna szerokość ekranu używanego urządzenia. Pamiętaj, aby wziąć pod uwagę odpowiednie bezpieczne obszary.

  • Metody sprawdzania rozmiaru reklamy to:

    • AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)
    • AdSize.getLandscapeInlineAdaptiveBannerAdSize(int width)
    • AdSize.getPortraitInlineAdaptiveBannerAdSize(int width)
    • AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight)
  • W przypadku wbudowanych interfejsów API banerów adaptacyjnych pakiet SDK do reklam mobilnych Google zwraca parametr AdSize o podanej szerokości i flagi wbudowanej. W zależności od używanego interfejsu API wysokość wynosi zero lub maxHeight. Rzeczywista wysokość reklamy jest udostępniana po jej zwróceniu.

  • Wbudowany baner adaptacyjny jest przeznaczony do umieszczania w treściach, które można przewijać. W zależności od interfejsu API baner może mieć wysokość ekranu urządzenia lub maksymalną wysokość.

Implementacja

Aby wdrożyć prosty śródtekstowy baner adaptacyjny, wykonaj podane niżej czynności.

  1. Skorzystaj z rozmiaru wbudowanego adaptacyjnego banera reklamowego Pobrany rozmiar będzie używany do wysłania żądania banera adaptacyjnego. Aby móc korzystać z rozmiaru reklamy adaptacyjnej:
    1. Określ szerokość urządzenia w pikselach niezależnych od gęstości lub ustaw własną szerokość, jeśli nie chcesz korzystać z pełnej szerokości ekranu. Możesz użyć wartości MediaQuery.of(context), aby określić szerokość ekranu.
    2. Użyj odpowiednich metod statycznych w klasie rozmiaru reklamy, np. AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width), aby uzyskać wbudowany adaptacyjny obiekt AdSize dla bieżącej orientacji.
    3. Jeśli chcesz ograniczyć wysokość banera, możesz użyć metody statycznej AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight).
  2. Utwórz obiekt BannerAd z identyfikatorem jednostki reklamowej, adaptacyjnym rozmiarem reklamy i obiektem żądania reklamy.
  3. Wczytaj reklamę.
  4. W wywołaniu zwrotnym onAdLoaded użyj funkcji BannerAd.getPlatformAdSize(), aby pobrać zaktualizowany rozmiar reklamy na platformie i zaktualizować wysokość kontenera AdWidget.

Przykładowy kod

Oto przykładowy widżet, który wczytuje wbudowany baner adaptacyjny tak, aby pasował do szerokości ekranu, i uwzględnia wcięcia:

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();
  }
}