使用OpenGL时简单的Android加载屏幕

我的游戏在Android上使用openGL ES 2.0,并且暂停(加载资源时)已经变得明显。

我所要做的就是显示一个静态屏幕(如果是最简单的方式,可能是通过XML布局,但通过openGL也可以)。 然后closures视图并切换到游戏。

我在我的GLSurfaceView类的onSurfaceCreated方法中加载资源,并在我的onSurfaceChanged方法中创建我的精灵对象(我需要宽度和高度来缩放它们,所以在这里做,再加上Google的文档推荐它)。 我不加载我的资源在onCreate。

我已经尝试创建一个简单的XML布局,称为“加载”,并把这样的东西放入我的glSurfaceView类的构造函数(glSurfaceView是我的Activity类的内部类)….

public MyGLSurfaceView(Context context) { super(context); { loading_dialog = new Dialog(context,android.R.style.Theme_Black_NoTitleBar_Fullscreen); loading_dialog.setContentView(R.layout.loading); loading_dialog.show(); } 

这显示我的“加载”屏幕确定,但我需要打电话:

 loading_dialog.dismiss(); 

在我的GLSurfaceView.Renderer类的onSurfaceChanged方法结束 。 我显然不能做到这一点,因为GLSurfaceView.Renderer类没有load_dialog对象的知识。

我试图直接在GLSurfaceView.Renderer类中创建对象,但是我不能从这里访问上下文,所以我尝试从Activity类中传入它,但是随后出现了不同的错误,我search了网上找不到明确的答案,所以我想在这里发帖,希望有人能指引我正确的方向。

非常感谢下面的答案,但是,我find了一个办法来做到这一点。 它的工作,所以我会张贴在这里,以防别人帮助别人。

在Activity类中 – 在onCreate中 ,获取Splashscreen类的对象并传入宽度和高度

  DisplayMetrics display= new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(display); width = display.widthPixels; height = display.heightPixels; Splashscreen splash = new SplashScreen(this.getApplicationContext(), width, height); 

在'MyGLSurfaceView'类的构造函数(这是我的Activity类的内部类),我有以下几点:

 public MyGLSurfaceView(Context context) { super(context); //Create dialogue which will be displayed over the GLSurfaceView while resources load Dialog loading_dialog = new Dialog(context,android.R.style.Theme_Black_NoTitleBar_Fullscreen); //Set it loading_dialog.setContentView(splash); //Show it loading_dialog.show(); //You would have already setContentView to your GLRenderer earlier in //onCreate, this just goes over the top of it //Get object to renderer class and pass in dialogue through constructor renderer = new MyGLRenderer(this, loading_dialog); 

然后我有我的splashscreen类,它使用一个简单的视图(因为我只想要一个基本的屏幕,如果我想以后可以添加简单的animation)。

 import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.view.View; public class SplashScreen extends View{ Bitmap loader; Bitmap loaderScaled; int width; int height; @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); //Show Scaled bitmap. canvas.drawBitmap(loaderScaled, x, y, null); //you can define x and y } public SplashScreen(Context context, int width, int height) { super(context); // TODO Auto-generated constructor stub this.width = width; this.height = height; //Initial Bitmap loader = BitmapFactory.decodeResource(getResources(), R.drawable.loading); //Create scaled bitmap loaderScaled = Bitmap.createScaledBitmap(loader, (int) (width*.25), (int) (height*.13), true); //And recycle the original bitmap as we no longer need it loader.recycle(); } } 

然后,所有你需要做的就是加载你的资源(我加载我的onSurfaceCreated)。 在onSurfaceChanged的最后,只需放下以下消除加载屏幕,并显示您Open GL渲染器….

 loading_dialog.dismiss(); 

它的工作原理,我已经testing了几个设备,有一些小问题,我要改进它,但基本的是有一个非常简单的启animation面。 我希望它能帮助那些正在寻求简单解决scheme的人。

PS我知道,而不是创建一个Splashscreen类,我可以简单地使用XML布局,但我不喜欢使用XML,我发现在代码中更加灵活。

基于个人经验(虽然我还没有碰到OpenGL),我的2D游戏应用程序有一个主屏幕类与不同的屏幕,独立于XML布局干。

我不是XML的狂热粉丝,因为在IDE中拖放graphics界面时(比如缩放,格式化布局等),尝试做更复杂的事情时,会变得杂乱无章。

对于我来说,创建一个抽象的屏幕类,像Spl​​ashScreen,LoadScreen,MenuScreen这样的子类用更新,暂停,绘制等方法从抽象类inheritance。

然后,在这些屏幕类中你所要做的就是在绘图方法中使用Graphics g = game.getGraphics(),然后为该屏幕绘制图像。 然后,我使用触摸事件类来声明一个事件发生在该屏幕类的update()方法中的边界,如下所示:

 public boolean inBounds(TouchEvent event, int x, int y, int width, int height) { if (event.x > x && event.x < x + width - 1 && event.y > y && event.y < y + height - 1) return true; else return false; } public void updateMenuScreen() { int len = touchEvents.size(); for (int i = 0; i < len; i++) { TouchEvent event = touchEvents.get(i); if (event.type == TouchEvent.TOUCH_UP) { if (inBounds(event, 260, 200, 300, 100)) { game.setScreen(new GameModeScreen(game)); } 

显然,还有一些其他的方法和类可以使这个post变得非常庞大,但是我希望你有一个总体的想法,使用屏幕类和“button”(触摸事件)在这些屏幕之间导航可能会对你有所帮助。 此外,不要害怕使用graphics和canvas类为一些二维菜单。