不使用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
相关产品推荐
相关产品推荐

