2012-06-05 16 views
16

ho main.xml come segue:Come aggiungere libgdx come una vista sub in Android

<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> 

E il mio principale classe di attività è la seguente:

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

La mia classe GDX è la seguente che estendono la classe ApplicationListener anziché 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() { 
    } 
} 

Ora, come devo aggiungere Sheet3DViewGdx come sottoview nel mio layout principale?

risposta

19

La classe AndroidApplication (che estende l'attività) ha un metodo denominato initializeForView(ApplicationListener, AndroidApplicationConfiguration) che restituirà un View che è possibile aggiungere al proprio layout.

Così la classe Test può estendere AndroidApplication anziché Activity in modo che sia possibile chiamare tale metodo e aggiungere la Vista al proprio layout.

Se questa non è un'opzione, per qualche motivo, dai un'occhiata a ciò che fa AndroidApplication source code e imitalo.

+0

Grazie a @Matsemann. ma ancora non spiega come raggiungerlo. Puoi dirlo brevemente? –

+0

Quindi ha funzionato? –

+0

Grazie, ha funzionato. –

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

Utilizzando un progetto libgdx come una vista all'interno di un app Android è ora documentato in modo chiaro, con codice di esempio, nel libgdx wiki, implemented as a Fragment (la migliore pratica per i moderni applicazioni Android):

  1. Aggiungi Android V4 Support Library per il progetto -android e il suo percorso di build se non lo hai già aggiunto. Ciò è necessario al fine di estendere FragmentActivity tardi
  2. attività di modifica AndroidLauncher di estendere FragmentActivity, non AndroidApplication
  3. Implementare AndroidFragmentApplication.Callbacks sull'attività AndroidLauncher
  4. creare una classe che estende AndroidFragmentApplication, che è l'implementazione Frammento per Libgdx.
  5. Aggiungere il codice initializeForView() nel metodo onCreateView di Fragment.
  6. Infine, sostituire il contenuto dell'attività AndroidLauncher con il frammento Libgdx.
+0

Ho creato un programma Hello Word per libgdx in esecuzione in un frammento utilizzando Android Studio 2.1 -> https://github.com/kbigdelysh/libgdx-in-fragment/archive/master.zip –

+0

Desidero postare domande e risposte SO inclusi collegamenti automatici a progetti Github per codice di esempio. – Matthew

8

ho creato un Hello World program on github per libgdx in esecuzione in un frammento utilizzando Android Studio 2.1. Segue the instructions on the official libgdx wiki.

enter image description here

classe 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 classe 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: Classe

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

assicurati di aver aggiunto il seguente: "{.} dipendenze"

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

Per lo script Gradle progetto nella sezione interna progetto (": android") sezione.

Problemi correlati