Używanie wbudowanych banerów adaptacyjnych w przypadku banerów przewijanych

Wybierz platformę: Android Nowy Android iOS Flutter

Banery adaptacyjne to nowa generacja reklam elastycznych, które zapewniają maksymalną skuteczność dzięki optymalizacji rozmiaru reklamy na każdym urządzeniu. Banery adaptacyjne są ulepszoną wersją banerów o stałym rozmiarze, które obsługiwały tylko stałe wysokości. Banery adaptacyjne pozwalają programistom określić szerokość reklamy i wykorzystują te dane do wyznaczenia optymalnego rozmiaru reklamy.

Aby dobrać najlepszy rozmiar reklamy, banery adaptacyjne w tekście używają maksymalnych wysokości zamiast stałych. Dzięki temu można zwiększyć skuteczność.

Kiedy stosować banery adaptacyjne w tekście

Banery adaptacyjne w tekście są większe i wyższe niż zakotwiczone banery adaptacyjne. Mają zmienną wysokość i mogą zajmować całą wysokość ekranu urządzenia.

Są przeznaczone do umieszczania w treściach przewijanych, np.:

Wymagania wstępne

Zanim zaczniesz

Podczas implementowania banerów adaptacyjnych w aplikacji pamiętaj o tych kwestiach:

  • Upewnij się, że używasz najnowszej wersji Google Mobile Ads Flutter Plugin, a jeśli korzystasz z mediacji, najnowszych wersji adapterów mediacji.

  • Rozmiary banerów adaptacyjnych w tekście są najlepiej dostosowane do używania 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 o uwzględnieniu odpowiednich bezpiecznych obszarów.

  • Aby korzystać z rozmiarów adaptacyjnych, może być konieczne zaktualizowanie lub utworzenie nowych elementów zamówienia. Więcej informacji.

  • Metody uzyskiwania rozmiaru reklamy to:

    • AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)
    • AdSize.getLandscapeInlineAdaptiveBannerAdSize(int width)
    • AdSize.getPortraitInlineAdaptiveBannerAdSize(int width)
    • AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight)
  • Gdy używasz interfejsów API banerów adaptacyjnych w tekście, Google Mobile Ads Flutter Plugin zwraca obiekt AdSize o podanej szerokości i fladze w tekście. Wysokość wynosi zero lub maxHeight w zależności od używanego interfejsu API. Rzeczywista wysokość reklamy jest dostępna po jej zwróceniu.

  • Baner adaptacyjny w tekście jest przeznaczony do umieszczania w treściach przewijanych. Baner może zajmować całą wysokość ekranu urządzenia lub mieć określoną maksymalną wysokość zależnie od ustawień w interfejsie API.

Implementacja

Aby zaimplementować prosty baner adaptacyjny w tekście, wykonaj te czynności:

  1. Uzyskaj rozmiar adaptacyjnego banera reklamowego w tekście. Uzyskany rozmiar będzie używany do wysyłania żądań banera adaptacyjnego. Aby uzyskać rozmiar reklamy adaptacyjnej:
    1. Uzyskaj szerokość używanego urządzenia w pikselach niezależnych od gęstości lub ustaw własną, jeśli nie chcesz, aby reklama zajęła całą szerokość ekranu. Aby uzyskać szerokość ekranu, możesz użyć MediaQuery.of(context).
    2. Zastosuj odpowiednie metody statyczne klasy AdSize, np. AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width) aby uzyskać adaptacyjny obiekt klasy AdSize w tekście dla bieżącej orientacji ekranu.
    3. Jeśli chcesz ograniczyć wysokość banera, możesz użyć metody statycznej AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight).
  2. Utwórz obiekt AdManagerBannerAd z identyfikatorem jednostki reklamowej, rozmiarem reklamy adaptacyjnej i obiektem żądania reklamy.
  3. Załaduj reklamę.
  4. W wywołaniu zwrotnym onAdLoaded użyj AdManagerBannerAd.getPlatformAdSize(), aby uzyskać zaktualizowany rozmiar reklamy na platformie i zaktualizować wysokość kontenera AdWidget.

Przykładowy kod

Oto przykładowy widżet, który wczytuje baner adaptacyjny w tekście, aby dopasować go do szerokości ekranu, uwzględniając 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;
  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();
  }
}