Wie kann ich Mehrere GLSurfaceView Komponenten im gleichen Layout?
Schreibe ich eine Information Visualization API für Android und lief in ein problem, statt zu versuchen, zwei Einheiten einer benutzerdefinierten GLSurfaceView
in ein Layout. Die Benutzerdefinierte GLSurfaceView
an dieser Stelle ist lediglich eine Erweiterung des GLSurfaceView
beseitigen Sie mögliche Störungen, die von benutzerdefinierten Methoden.
Wenn ich beide Komponenten Hinzugefügt, layout und starten Sie die Anwendung, es läuft. Aber nichts gezeichnet, wie es scheint in eine unendliche Schleife. weil die debug-Meldungen in die Renderer sind gedruckt in der LogCat. Aber Es funktioniert völlig in Ordnung, wenn ich nur eine der benutzerdefinierten GLSurfaceView
Komponenten.
Ich gelesen, dass es ein problem mit GLSurfaceView
in mehrere Aktivitäten und ich nehme an, das gilt auch bei Verwendung zwei dieser Komponenten bei der gleichen Zeit. Ich habe den workaround gepostet hier aber kann nicht scheinen, um es zu arbeiten entweder.
Ich würde jede Hilfe zu schätzen wissen. Ich wähle zu verwenden openGL für die bessere Leistung, aber wenn ich nicht verwenden können mehrere Komponenten auf einmal ich denke, ich werde Leinwand statt.
Manifest sieht wie folgt aus:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/hello" android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.syntronic.vtadlib.VisualizationView android:id="@+id/glview"
android:layout_width="fill_parent" android:layout_height="300px" />
<TextView android:text="@string/hello" android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.syntronic.vtadlib.VisualizationView android:id="@+id/glview2"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>
Aus der Aktivität der code ist wie folgt:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSurfaceView = (VisualizationView) findViewById(R.id.glview);
mSurfaceView2 = (VisualizationView) findViewById(R.id.glview2);
//Enables debug flags for Errors
//mSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR);
//mSurfaceView2.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR);
mSurfaceView.setRenderer(new CoordinateSystemRenderer());
mSurfaceView2.setRenderer(new CoordinateSystemRenderer());
}
@Override
protected void onPause() {
//TODO Auto-generated method stub
super.onPause();
mSurfaceView.onPause();
mSurfaceView2.onPause();
}
@Override
protected void onResume() {
//TODO Auto-generated method stub
super.onResume();
mSurfaceView.onResume();
mSurfaceView2.onResume();
}
Übersehe ich hier etwas offensichtliches? Oder kann jemand erklären, warum es nicht funktioniert?
- Die erste Sache, springt bei mir ist, dass Ihr geschachtelten LinearLayout eingestellt ist fill_parent. Ich würde überprüfen, um sicherzustellen, dass beide Ihre GLSurfaceViews sind, legte sich mit nicht-null-Höhe. Kann es sein, dass Sie sind sowohl in der Zeichnung, aber das eine hat eine Höhe von 0 Pixel und ist somit unsichtbar.
- Anstelle von zwei
GLSurfaceViews
, vielleicht besser zu erstellen/verwalten, ein GL-Gewinde und dem Kontext selbst anwenden, die zu zweiSurfaceViews
(NICHTGLSurfaceViews
). Siehe fadden Diskussion und link zu Grafika.
Du musst angemeldet sein, um einen Kommentar abzugeben.
[UPDATE: Diese Antwort ist nicht mehr korrekt sind, wie von Android 5.0 (Lollipop). Sehen fadden ' s Antwort für eine Diskussion und links. Es war auch falsch, da von Android 2.0, und war offenbar nur ein Problem für ÜBERLAPPENDE Oberflächen, noch bevor dann.]
Können Sie nicht Platz 2 SurfaceViews(SV) in eine Aktivität.
Für verstehen, warum Sie sollten wissen, wie SVs arbeitet.
Beim erstellen und platzieren Sie es auf die Aktivität, die es nicht auch tatsächlich platziert werden, die in der Aktivität (oder oben drauf), sondern es wird geschaffen, hinter der die aktuelle Aktivität mit "transparent" - Ansicht erstellt, die Aktivität.
In Android 4.0 (API 14) es gibt neue Ansicht namens TextureView
Es gibt keine Möglichkeit so etwas zu schaffen wie die, dass die Aussicht auf älteren Plattformen.
Was die Umsetzung für
CoordinateSystemRenderer
?Traf ich die gleiche Anforderung heute und versucht, es tatsächlich funktioniert, dass bedeutet, Sie können 2
GLSurfaceView
in ein und derselben Aktivität.Etwas brauchen, um bemerkt zu werden,
GLRender
, wennonSurfaceChanged
aufgerufen wird, müssen Sie ändern Sie die Größe des viewportGLSurfaceView
die render-thread eine 2, also synchronisieren, wird das Problem aufgetreten ist. Es hängt davon ab, Ihre UmsetzungonDrawFrame
.Es gibt einen schnellen test, um die Android-API-demo im SDK
GLSurfaceViewActivity
Es ist eine Menge Los hinter den GLSurfaceView einschließlich der Verwaltung des GLContext, ich bin mir ziemlich sicher, dass Sie nicht in der Lage sein, es zu schaffen, selbst wenn es Ihnen gelingt, Sie möglicherweise in mehr unerwartete Probleme später auf. Also ich glaube wirklich, es ist nicht die richtige Anwendung Architektur.
Können Sie möglicherweise wollen untersuchen, überlagerungen/unter-legen Sie Ihre Modelle im "richtigen" Bereich des Bildschirms mit einem Vollbild GLSurfaceView. Sie Mai wollen zusammen eine Art von layout-Rahmen, um diese einfacher, oder vielleicht die Verwendung mehrerer Ansichtsfenster auf die volle Bildschirm GLSurfaceView. Habe nicht versucht, diese in OpenGL ES, aber in der Regel entweder von diesen Methoden werden die für die Wiedergabe mit mehreren Ansichten die gleiche oder sogar viele verschiedene Modelle in einer einzigen Anwendung auf einem desktop-system eher als die Verwendung mehrerer GLContexts (wenn es das ist, was passiert hinter den kulissen hier).
Hier ist ein alternativer Weg, es zu tun. Laden Sie die Probe aus dem Android-docs hier: http://developer.android.com/shareables/training/OpenGLES.zip
In dieser zip Datei finden Sie 2 Projekte. Öffnen Sie das Projekt: HelloOpenGLES20 und ersetzen die 'MyGLRenderer' Klasse mit meinem unten aufgeführten, und führen Sie das Projekt.
Aus, was ich verstehe, OpenGLES konzipiert ist, mit nur Einem Blick, sondern mit potenziell mehrere Render-targets. Allerdings muss ich admin ich bin nicht sicher, was Sie zu tun versuchen falsch ist oder nicht. Ich bin ein bisschen ein newb auf OpenGLES mich. Ich habe eine OpenGL open-source-Bibliothek in bitbucket. Sie können in der Lage sein, einige Ideen zu bekommen von ihm: https://bitbucket.org/warwick/hacergestov2, es ist eine Geste Bibliothek.
Können Sie mehrere
GLSurfaceViews
aktiv und sichtbar in eine Aktivität. Jede view bekommt seine eigene GL-Kontext.