studio - Cómo agregar libgdx como una subvista en Android
libgdx wiki (4)
Tengo main.xml de la siguiente manera:
<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>
Y mi principal clase de actividad es la siguiente:
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);
}
}
Mi clase GDX es la siguiente que amplía la clase ApplicationListener en lugar de Ver.
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() {
}
}
Ahora, ¿cómo debo agregar Sheet3DViewGdx como una subvista en mi diseño principal?
El uso de un proyecto libgdx como una vista dentro de una aplicación de Android ahora se documenta claramente, con un código de ejemplo, en el wiki de libgdx, implementado como un Fragmento (la mejor práctica para las aplicaciones modernas de Android):
- Agregue la biblioteca de soporte de Android V4 al proyecto -android y su ruta de compilación si aún no lo ha agregado. Esto es necesario para extender FragmentActivity más adelante.
- Cambie la actividad de Android Launcher para extender FragmentActivity, no AndroidApplication
- Implementar AndroidFragmentApplication.Callbacks en la actividad AndroidLauncher
- Cree una clase que amplíe AndroidFragmentApplication, que es la implementación de fragmentos para Libgdx.
- Agregue el código initializeForView () en el método onCreateView del Fragmento.
- Finalmente, reemplace el contenido de la actividad de Android Launcher con el Fragmento Libgdx.
He creado un programa Hello World en github para libgdx que se ejecuta en un fragmento con Android Studio 2.1. Sigue las instrucciones en el wiki oficial de libgdx .
Clase 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() {
}
}
La clase 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>
Clase 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();
}
}
Asegúrate de haber agregado lo siguiente:
compile "com.android.support:support-v4:24.1.1"
A la secuencia de comandos de proyecto en la sección "dependencias {.}" Dentro de la sección proyecto (": android").
La clase AndroidApplication (que extiende la actividad) tiene un método llamado initializeForView(ApplicationListener, AndroidApplicationConfiguration)
que devolverá una View
que puede agregar a su diseño.
Por lo tanto, su clase de prueba puede extender la aplicación Android en lugar de la actividad para que pueda llamar a ese método y agregar la vista a su diseño.
Si esa no es una opción, por alguna razón, eche un vistazo a lo que hace el código fuente de AndroidApplication e imite eso.
@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));
}