Skip to content

getGameView

获取游戏视图控件

getGameView 用于获取小游戏在原生层渲染的 View 控件

小游戏的画面是通过一个自定义的 Surface(如 TextureViewSurfaceView)呈现的。通过此方法,你可以将游戏画面像普通的 Android View 一样添加到你的 Activity 布局、Fragment 或任何 View 容器中。


方法声明

java
/**
 * 获取小游戏 View 实例
 * * @return 返回游戏渲染的 View 对象;若环境尚未初始化,可能返回 null。
 */
View getGameView();

核心运行行为

1. 调用时机

通常在 create() 执行成功并监听到进入 GAME_STATE_WAITING 状态后调用。此时,底层的渲染表面已经准备就绪。

2. 视图属性

  • 类型:返回的是标准的 android.view.View,你可以对其设置 LayoutParams、透明度、动画等。
  • 唯一性:一个 GameHandle 实例对应一个唯一的 GameView

3. 生命周期绑定

当调用 destroy() 时,该 View 会被销毁并从其父容器中自动(或需手动)处理。销毁后不可复用。


代码示例:将游戏添加到布局

java
// 1. 在布局中预留一个容器(如 FrameLayout)
FrameLayout container = findViewById(R.id.game_container);

// 2. 监听到状态变为 WAITING 或 RUNNING 时获取 View
gameHandle.setGameStateListener(new SUDRTGameHandle.GameStateChangeListener() {
    @Override
    public void onStateChanged(int fromState, int toState) {
        if (toState == SUDRTGameHandle.GAME_STATE_WAITING) {
            
            // 切换到主线程操作 UI
            runOnUiThread(() -> {
                View gameView = gameHandle.getGameView();
                
                if (gameView != null && gameView.getParent() == null) {
                    // 3. 将游戏视图添加到容器中
                    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
                            ViewGroup.LayoutParams.MATCH_PARENT,
                            ViewGroup.LayoutParams.MATCH_PARENT
                    );
                    container.addView(gameView, lp);
                }
            });
        }
    }
});

注意事项

  • 线程限制:由于涉及 UI 操作,添加或移除 getGameView() 返回的对象必须在 Android 主线程(UI Thread) 执行。
  • 重复添加检查:在添加 View 之前,建议检查 gameView.getParent() == null,防止因状态多次回调导致 IllegalStateException: The specified child already has a parent.
  • 尺寸调整:游戏画面通常会自动适配 View 的宽高。如果你需要强制改变游戏的分辨率或比例,通常应通过 setGameStartOptions 中的配置项进行,而非仅仅缩放 View。