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

Biểu ngữ thích ứng là thế hệ mới của quảng cáo thích ứng, giúp bạn 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 (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 giá trị 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. Nhờ đó, bạn có cơ hội cải thiện hiệu suất.

Trường hợp nên 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 thiết bị.

Thẻ này được dùng 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 đầy đủ của màn hình mà thiết bị đang sử dụng. Hãy nhớ cân nhắc các vùng an toàn (nếu có).

  • Bạn có thể cần cập nhật hoặc tạo các mục hàng mới phù hợp với các kích thước thích ứng. Tìm hiểu thêm.

  • 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 trên thiết bị di động của Google 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 sẽ 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ế để nằm 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. Để có kích thước quảng cáo thích ứng, hãy đảm bảo rằng bạn:
    1. Lấy chiều rộng của thiết bị đang sử dụng tính bằng 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) để lấy chiều rộng của màn hình.
    2. Sử dụng các phương thức tĩnh thích hợp cho lớp kích thước quảng cáo, chẳng hạn như AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(int width) để tải đố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 AdManagerBannerAd có mã đơn vị quảng cáo, kích thước quảng cáo thích ứng và đố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 AdManagerBannerAd.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;
  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: '<your-ad-unit>',
      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();
  }
}