You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用Scene2D的LibGdx项目如何接入AdMob并关联Android View?

适配无Scene2D的LibGDX项目AdMob接入方案

你仅需适配Android平台,无需跨平台兼容的场景下,用接口桥接的方式即可实现接入,完全不需要依赖Scene2D相关组件,以下是完整实现步骤:

第一步:核心项目层定义广告回调接口

在core模块新建AdController.java作为Android层和LibGDX核心层的通信桥,不需要引入任何Android依赖:

public interface AdController {
    // 展示插屏广告
    void showInterstitialAd();
    // 检查横幅是否显示
    boolean isBannerShown();
    // 切换横幅显隐状态
    void toggleBanner(boolean show);
}

第二步:修改继承自Game的GameTest类

给GameTest新增构造函数,接收AdController实例并存为成员变量,方便各个Screen调用:

public class GameTest extends Game {
    public final AdController adController;

    public GameTest(AdController adController) {
        this.adController = adController;
    }

    @Override
    public void create() {
        // 原有初始化逻辑保持不变,将adController实例传给PlayScreen
        setScreen(new PlayScreen(this));
    }
}

第三步:PlayScreen中调用广告逻辑

完全不需要引入Scene2D组件,你可以在任意业务节点触发广告调用,比如游戏结束、关卡切换的时机:

public class PlayScreen implements Screen {
    private final GameTest game;

    public PlayScreen(GameTest game) {
        this.game = game;
        // 原有初始化逻辑不变:Viewport、Camera等配置不需要修改
    }

    // 示例:游戏结束时调用插屏广告
    private void onGameOver() {
        // 原有游戏结束逻辑保持不变
        game.adController.showInterstitialAd();
        // 也可以控制横幅显隐,比如游戏对局中隐藏横幅,结算界面显示横幅
        game.adController.toggleBanner(true);
    }

    @Override
    public void render(float delta) {
        // 原有渲染逻辑完全不需要修改,和广告逻辑完全解耦
    }

    // 其他Screen接口方法保持原有实现即可
}

第四步:Android层Activity实现AdController接口,关联View

你的Android项目主Activity继承AndroidApplication,同时实现刚才定义的AdController接口,用布局容器同时承载LibGDX的游戏View和AdMob的广告View即可:

import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.InterstitialAd;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;

public class AndroidLauncher extends AndroidApplication implements AdController {
    private AdView bannerAd;
    private InterstitialAd interstitialAd;
    private RelativeLayout rootLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        // 初始化LibGDX游戏View
        View gameView = initializeForView(new GameTest(this), config);
        
        // 创建根布局
        rootLayout = new RelativeLayout(this);
        rootLayout.addView(gameView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        
        // 初始化横幅广告
        bannerAd = new AdView(this);
        bannerAd.setAdSize(AdSize.BANNER);
        bannerAd.setAdUnitId("你的横幅广告ID");
        RelativeLayout.LayoutParams bannerParams = new RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
        );
        bannerParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        bannerParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        bannerAd.setLayoutParams(bannerParams);
        bannerAd.loadAd(new AdRequest.Builder().build());
        bannerAd.setVisibility(RelativeLayout.GONE); // 默认隐藏横幅
        rootLayout.addView(bannerAd);
        
        // 初始化插屏广告
        interstitialAd = new InterstitialAd(this);
        interstitialAd.setAdUnitId("你的插屏广告ID");
        interstitialAd.loadAd(new AdRequest.Builder().build());
        
        // 把根布局设置为Activity的内容视图
        setContentView(rootLayout);
    }

    @Override
    public void showInterstitialAd() {
        runOnUiThread(() -> {
            if (interstitialAd.isLoaded()) {
                interstitialAd.show();
                // 展示完成后预加载下一个插屏广告
                interstitialAd.loadAd(new AdRequest.Builder().build());
            }
        });
    }

    @Override
    public boolean isBannerShown() {
        return bannerAd.getVisibility() == RelativeLayout.VISIBLE;
    }

    @Override
    public void toggleBanner(boolean show) {
        runOnUiThread(() -> {
            bannerAd.setVisibility(show ? RelativeLayout.VISIBLE : RelativeLayout.GONE);
        });
    }

    // 补充AdMob生命周期适配
    @Override
    public void onPause() {
        if (bannerAd != null) bannerAd.pause();
        super.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
        if (bannerAd != null) bannerAd.resume();
    }

    @Override
    public void onDestroy() {
        if (bannerAd != null) bannerAd.destroy();
        super.onDestroy();
    }
}

注意事项

  • 不要忘记在AndroidManifest.xml中添加AdMob所需的权限、元数据配置以及网络权限
  • 所有AdMob的View操作必须放到Android UI线程执行,上述代码中的runOnUiThread不可省略
  • 该方案和你现有Viewport、Camera逻辑完全无冲突,不需要修改任何游戏渲染相关代码

内容的提问来源于stack exchange,提问作者user1572522

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:24:03