以下代码显示了如何将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;
}
答案 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()方法启动。