2012-06-05 21 views
16

tengo main.xml de la siguiente manera:Cómo agregar libgdx como una vista en sub androide

<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 clase principal 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 extiende la clase ApplicationListener en lugar de 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() { 
    } 
} 

Ahora, ¿cómo debo agregar Sheet3DViewGdx como una subvista en mi diseño principal?

Respuesta

19

La clase AndroidApplication (que extiende la actividad) tiene un método llamado initializeForView(ApplicationListener, AndroidApplicationConfiguration) que devolverá un View que puede agregar a su diseño.

Por lo tanto, su clase de prueba puede extender AndroidApplication en lugar de Activity 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 AndroidApplication source code hace, e imite eso.

+0

Gracias @Matsemann. pero aún así no explica cómo lograrlo. ¿Puedes por favor contarlo brevemente? –

+0

Entonces, ¿funcionó? –

+0

Gracias, funcionó. –

3
@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)); 
} 
6

Usando un proyecto libgdx como una vista interior de una aplicación para Android está ahora claramente documentado, con código de ejemplo, en el libgdx wiki, implemented as a Fragment (la mejor práctica para las modernas aplicaciones de Android):

  1. Añadir Android V4 Support Library para el proyecto de Android y su ruta de compilación si aún no lo ha agregado. Esto es necesario a fin de ampliar FragmentActivity tarde
  2. actividad Cambio AndroidLauncher extender FragmentActivity, no AndroidApplication
  3. Implementar AndroidFragmentApplication.Callbacks sobre la actividad AndroidLauncher
  4. crear una clase que se extiende AndroidFragmentApplication que es la puesta en práctica del fragmento por libgdx.
  5. Agregue el código initializeForView() en el método onCreateView del fragmento.
  6. Finalmente, reemplace el contenido de actividad de AndroidLauncher con el Fragmento Libgdx.
+0

He creado un programa Hello Word para ejecutar libgdx en un fragmento usando Android Studio 2.1 -> https://github.com/kbigdelysh/libgdx-in-fragment/archive/master.zip –

+0

Deseo publicar SO preguntas y respuestas incluidos enlaces automáticos a proyectos de Github, por ejemplo, código. – Matthew

8

He creado una Hello World program on github para libgdx se ejecuta en un fragmento usando Android Studio 2.1. Sigue a the instructions on the official libgdx wiki.

enter image description here

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()); 
    } 
} 

diseño.xml: Clase

<?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(); 
    } 
} 

Asegúrese de que ha añadido lo siguiente: "{.} dependencias"

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

Para el guión Gradle proyecto en la sección interior proyecto (": android") sección.

Cuestiones relacionadas