如何在android中添加libgdx作为子视图

我有如下main.xml:

<RelativeLayout> ... <FrameLayout android:id="@+id/panel_sheet" android:layout_width="match_parent" android:layout_height="match_parent"> <com.libgdx.Sheet3DViewGdx android:id="@+id/m3D" android:layout_width="1000dp" android:layout_height="600dp" /> </FrameLayout> ... </RelativeLayout> 

而我的主要活动类如下:

 public class Test extends Activity { MainActivity m3DActivity; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 

我的GDX类如下扩展ApplicationListener类而不是View。

 public class Sheet3DViewGdx implements ApplicationListener{ @Override public void create() { InputStream in = Gdx.files.internal("data/obj/Human3DModel.obj").read(); model = ObjLoader.loadObj(in); } @Override public void dispose() { } @Override public void pause() { } @Override public void render() { Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); model.render(GL10.GL_TRIANGLES); } @Override public void resize(int arg0, int arg1) { float aspectRatio = (float) arg0 / (float) arg1; } @Override public void resume() { } } 

现在,我应该如何在主布局中添加Sheet3DViewGdx作为子视图?

Solutions Collecting From Web of "如何在android中添加libgdx作为子视图"

AndroidApplication类(扩展活动)有一个名为initializeForView(ApplicationListener, AndroidApplicationConfiguration) ,它将返回一个可以添加到布局的View

所以你的Test-class可以扩展AndroidApplication而不是Activity,这样你就可以调用这个方法并把View添加到你的布局中。

如果这不是一个选项,出于某种原因,看看AndroidApplication的源代码是什么,并模仿。

我在github上为使用Android Studio 2.1的片段运行libgdx创build了一个Hello Word程序 。 它遵循官方libgdx wiki上的说明 。

在这里输入图像说明

AndroidLauncher类:

 import android.os.Bundle; import android.support.v4.app.FragmentActivity; import com.badlogic.gdx.backends.android.AndroidFragmentApplication; public class AndroidLauncher extends FragmentActivity implements AndroidFragmentApplication.Callbacks { @Override public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout); // Create libgdx fragment GameFragment libgdxFragment = new GameFragment(); // Put it inside the framelayout (which is defined in the layout.xml file). getSupportFragmentManager().beginTransaction(). add(R.id.content_framelayout, libgdxFragment). commit(); } @Override public void exit() { } } 

GameFragment类:

 import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.badlogic.gdx.backends.android.AndroidFragmentApplication; public class GameFragment extends AndroidFragmentApplication{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // return the GLSurfaceView on which libgdx is drawing game stuff return initializeForView(new MyGdxGame()); } } 

layout.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_layout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content_framelayout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2"> </FrameLayout> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#FF0000" android:textColor="#00FF00" android:textSize="40dp" android:text="I'm just a TextView here with red background :("/> </LinearLayout> 

MyGdxGame类:

 import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; private BitmapFont font; @Override public void create () { batch = new SpriteBatch(); img = new Texture("badlogic.jpg"); font = new BitmapFont(); font.setColor(Color.BLUE); } @Override public void render () { Gdx.gl.glClearColor(0, 0, 0, 0); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); //batch.draw(img, 0, 0); font.getData().setScale(6.0f); font.draw(batch, "Hello World from libgdx running in a fragment! :)", 100, 300); batch.end(); } @Override public void dispose () { batch.dispose(); img.dispose(); } } 

确保你已经添加了以下内容:

 compile "com.android.support:support-v4:24.1.1" 

到project(“:android”)部分的“dependencies {..}”部分中的项目gradle脚本。

在Android应用程序中使用libgdx项目作为视图,现在已经清楚地logging在libgdx wiki中的示例代码中, 作为片段 (现代Android应用程序的最佳实践)实现:

  1. 将Android V4支持库添加到-android项目及其构buildpath(如果尚未添加)。 这是为了稍后扩展FragmentActivity所必需的
  2. 更改AndroidLauncher活动来扩展FragmentActivity,而不是AndroidApplication
  3. 在AndroidLauncher活动上实现AndroidFragmentApplication.Callbacks
  4. 创build一个扩展AndroidFragmentApplication的类,它是Libgdx的片段实现。
  5. 在Fragment的onCreateView方法中添加initializeForView()代码。
  6. 最后,用Libgdx片段replaceAndroidLauncher活动内容。
 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration(); cfg.useGL20 = false; //initialize(new LoveHearts(), cfg); LinearLayout lg=(LinearLayout)findViewById(R.id.game); lg.addView(initializeForView(new LoveHearts(), cfg)); }