将Libgdx游戏加载到片段会在Android

时间:2018-03-05 05:37:09

标签: android android-fragments libgdx

以下代码显示了如何将Libgdx游戏(MyGdxGame)加载到LinearLayout。在游戏创建我设置了一个相机并加载一个小的WAV声音文件。加载视图后加载纹理。

问题是在片段转换到此片段期间,存在明显的黑色闪烁和延迟。是否有可能减少这种方式并改善片段转换。

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = null;
    Bundle bundle = getArguments();
    if (bundle != null) {
        this.input = bundle.getParcelable(Utils.FRAGMENT_INPUT_KEY);
    } else {
        input = new FragmentInput();
    }

    view = inflater.inflate(R.layout.solve, container, false);
    surface = (LinearLayout) view.findViewById(R.id.puzzleView);

    activity = (MainActivity) getActivity();

    com.badlogic.gdx.graphics.Color color = new com.badlogic.gdx.graphics.Color(Color.red(input.backColor) / 255f,
            Color.green(input.backColor) / 255f,
            Color.blue(input.backColor) / 255f, 1.0f);
    size = input.pieceCount;
    cols = input.columns;
    GameData gdata = new GameData();
    gdata.rows = size / cols;
    gdata.columns = cols;
    gdata.backColor = color;
    gdata.setCategory(input.category);
    if (input.rotated) {
        gameView = new MyGdxGameRotate(this, gdata);
    } else {
        gameView = new MyGdxGame(this, gdata);
    }

    if (surface != null) {
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        View game = initializeForView(gameView, config);
        surface.addView(game);
    }
    return view;
}

2 个答案:

答案 0 :(得分:1)

在片段显示之前调用

onCreateView,在这里做繁重的工作意味着你要延迟显示该视图('黑色闪光'),而应该首先将繁重的工作转移到{ {1}}或至少onResume

其次,将加载放在后台线程上,以便UI线程可以继续处理片段的显示。在Android中执行此操作的最简单方法是使用AsyncTask,这将允许您在加载所有内容时轻松通知UI

onViewCreated

如果您不熟悉Android,请注意使用此方法泄露上下文

答案 1 :(得分:1)

我对Libgdx并不熟悉所以我的观察并不是针对Libgdx的。如果视图初始化需要时间,并且假设必须在UI线程上完成,也许您可​​以使用Framelayout并在位于当前puzzleView顶部的ImageView中覆盖启动图形,并将其初始可见性设置为可见在xml中。在onCreateView中,在您正在进行时对视图进行充气,然后只找到对puzzleView的引用,但不进行任何初始化。然后,您可以在调用onResume方法时检查视图是否已初始化(如果没有,则创建一个新的布尔字段),如果没有,则初始化它,然后将顶层的可见性设置为不可见以显示puzzleView。延迟仍然存在,但屏幕将由顶层图形覆盖,直到onResume()返回,此时(可能)初始化完成。如果初始化的重要部分可以在后台线程上完成,那么可能会在调用onCreateView时触发执行工作的后台线程,并更改顶层的可见性并完成初始化的一部分(几乎肯定需要在UI线程上完成一个Runnable,它应该通过后台线程中的runOnUiThread()方法启动。