Quảng cáo biểu ngữ thích ứng cùng dòng

Biểu ngữ thích ứng là thế hệ tiếp theo của quảng cáo thích ứng, giúp tối đa hoá hiệu suất bằng cách tối ưu hoá kích thước quảng cáo cho từng thiết bị. Được cải tiến dựa trên biểu ngữ có kích thước cố định vốn chỉ hỗ trợ chiều cao cố định, biểu ngữ thích ứng cho phép nhà phát triển chỉ định chiều rộng của quảng cáo và sử dụng thông tin này để xác định kích thước quảng cáo tối ưu.

Để chọn kích thước quảng cáo phù hợp nhất, biểu ngữ thích ứng cùng dòng sử dụng chiều cao tối đa thay vì chiều cao cố định. Điều này mang đến cơ hội cải thiện hiệu suất.

Trường hợp sử dụng biểu ngữ thích ứng cùng dòng

Biểu ngữ thích ứng cùng dòng là biểu ngữ lớn hơn, cao hơn so với biểu ngữ thích ứng cố định. Các màn hình này có nhiều chiều cao và có thể cao bằng màn hình của thiết bị.

Thẻ này được thiết kế để đặt trong nội dung có thể cuộn, ví dụ:

Điều kiện tiên quyết

Trước khi bắt đầu

Khi triển khai biểu ngữ thích ứng trong ứng dụng của bạn, hãy lưu ý những điểm sau:

  • Đảm bảo bạn đang sử dụng phiên bản mới nhất của SDK Quảng cáo của Google trên thiết bị di động, và nếu bạn đang sử dụng tính năng dàn xếp, thì hãy sử dụng phiên bản mới nhất của bộ chuyển đổi dàn xếp.

  • Kích thước biểu ngữ thích ứng cùng dòng được thiết kế để hoạt động hiệu quả nhất khi sử dụng toàn bộ chiều rộng có sẵn. Trong hầu hết các trường hợp, đây sẽ là chiều rộng tối đa của màn hình mà thiết bị đang sử dụng. Hãy nhớ tính đến các vùng an toàn (nếu có).

  • Các phương pháp để thu được kích thước quảng cáo là:

    • AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width)
    • AdSize.getLandscapeInlineAdaptiveBannerAdSize(int width)
    • AdSize.getPortraitInlineAdaptiveBannerAdSize(int width)
    • AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight)
  • Khi sử dụng API biểu ngữ thích ứng cùng dòng, SDK Quảng cáo của Google trên thiết bị di động sẽ trả về một AdSize có chiều rộng nhất định và một cờ cùng dòng. Chiều cao là 0 hoặc maxHeight, tuỳ thuộc vào API bạn đang sử dụng. Chiều cao thực tế của quảng cáo có sẵn khi quảng cáo được trả về.

  • Biểu ngữ thích ứng cùng dòng được thiết kế để đặt trong nội dung có thể cuộn. Biểu ngữ có thể cao bằng màn hình của thiết bị hoặc bị giới hạn theo chiều cao tối đa, tuỳ thuộc vào API.

Triển khai

Hãy làm theo các bước bên dưới để triển khai một biểu ngữ thích ứng cùng dòng đơn giản.

  1. Thu thập kích thước của quảng cáo biểu ngữ thích ứng cùng dòng. Kích thước mà bạn nhận sẽ được dùng để yêu cầu biểu ngữ thích ứng. Để biết kích thước quảng cáo thích ứng, hãy đảm bảo rằng bạn:
    1. Biết chiều rộng của thiết bị đang sử dụng tính theo pixel không phụ thuộc vào mật độ hoặc đặt chiều rộng riêng nếu bạn không muốn sử dụng toàn bộ chiều rộng của màn hình. Bạn có thể sử dụng MediaQuery.of(context) để biết chiều rộng màn hình.
    2. Sử dụng các phương thức tĩnh thích hợp trên lớp kích thước quảng cáo, chẳng hạn như AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width) để thu thập đối tượng AdSize thích ứng cùng dòng cho hướng hiện tại.
    3. Nếu muốn giới hạn chiều cao của biểu ngữ, bạn có thể sử dụng phương thức tĩnh AdSize.getInlineAdaptiveBannerAdSize(int width, int maxHeight).
  2. Tạo một đối tượng BannerAd có mã đơn vị quảng cáo của bạn, kích thước quảng cáo thích ứng và một đối tượng yêu cầu quảng cáo.
  3. Tải quảng cáo.
  4. Trong lệnh gọi lại onAdLoaded, hãy sử dụng BannerAd.getPlatformAdSize() để lấy kích thước quảng cáo trên nền tảng đã cập nhật và cập nhật chiều cao vùng chứa AdWidget.

Ví dụ về mã

Dưới đây là một tiện ích mẫu giúp tải một biểu ngữ thích ứng cùng dòng sao cho vừa với chiều rộng của màn hình, có tính đến các phần lồng ghép:

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