2010-11-08 11 views
6

Zacząłem aplikacji Android OpenGL i mam następujących klas:Android glSurfaceView z przedrukiem z wykorzystaniem XML/Java

class A extends Activity 
class B extends GlSurfaceView implements Renderer 

Kiedy klasa A za onCreate nazywa, tworzy obiekt klasy typu B i wzywa:

Na razie działa i spędziłem na nim kilka dni.

Teraz chciałem dodać przyciski do mojej aplikacji i znalazłem przykład SurfaceViewOverlay. To wykorzystuje trochę XML do stworzenia hierarchii widoku. Chciałem stworzyć coś bardzo podobnego do I po prostu wyciąć i wkleić kod XML:

<android.opengl.GLSurfaceView android:id="@+id/glsurfaceview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    <LinearLayout android:id="@+id/hidecontainer" 
      android:orientation="vertical" 
      android:visibility="gone" 
      android:background="@drawable/translucent_background" 
      android:gravity="center" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
      ... 

Teraz pamiętając mój oryginalny klasy hierarchię, w jaki sposób zainicjować moje poglądy? Co powinienem napisać w onCreate() mojej klasie A?

Próbowałem za pomocą:

Bobject = new B(this); 
GLSurfaceView glSurfaceView = 
     (GLSurfaceView) findViewById(R.id.glsurfaceview); 
    glSurfaceView.setRenderer(Bobject); 

I robi rysować przycisków i widok GL na ekranie, ale widok GL nie jest w stanie podjąć w dowolnym wejściem z kranów/kliknięć.

Jest to prawdopodobne, ponieważ Bobject za onTouchEvent() nie jest wywoływana jak to jest tylko używany jako:

Renderer 

a nie:

glSurfaceView 

przedmiot.

Zamiast powyższego kodu, naprawdę chcę, aby Bobject zastąpił glSurfaceView. Ale nie wiem, jak to zrobić. Kiedy robię findViewById(), wydaje się, że glSurfaceView jest już utworzony na razie. Jak mogę poprosić go o użycie obiektu typu B do widoku GL?

Przepraszam za błędy każdego początkującego. Zupełnie nowy na Androida.

EDIT: Próbowałem też tak:

Próbowałem również następujący: W moim pliku XML, zmieniłem GLSurfaceView do:

<com.bla.bla.B 
      android:id="@+id/glsurfaceview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

I w moim klasy A konstruktora Wołam:

// This returns null 
Bobject = (B) findViewById(R.id.glsurfaceview); 

// And this suspends the application. :(
setContentView(R.layout.surface_view_overlay); 

Jak używać niestandardowej klasy, która rozszerza glSurfaceView w moim pliku XML/Activity?

+1

Utknąłem z tym samym problemem i nie mogłem znaleźć całej aplikacji demonstrującej to. Czy ktoś może pokazać przykładową aplikację? Nie mogę znaleźć tego słynnego przykładu SurfaceOverlayView z próbek Androida w dowolnym miejscu. Z góry dziękuję. – rgngl

Odpowiedz

7

Ok, więc to właściwy sposób na osiągnięcie tego jest mieć konstruktor w klasie B, który odbywa się w:

B(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
} 

A w układzie XML, użyj tego:

<com.bla.bla.B 
     android:id="@+id/glsurfaceview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

rzeczą, której brakowało w moim kodzie była sygnatura konstruktora.

+0

Dodawanie tej samej rzeczy, którą otrzymuję "Obiekt konstruktora (kontekst, atrybut) jest niezdefiniowany" Czy możesz mnie poprowadzić? – JehandadK

+0

Dodałem w klasie Renderer. – JehandadK

+0

Wielkie dzięki, bardzo pomocne – zest

1

Alternatywnym sposobem rozwiązania tego problemu jest pozostawienie swoich poglądów związanych z działaniem A.Więc zamiast korzystania setContentView (obiekt B) użyć setContentView (obiektu) i wewnątrz „xml” pliku, jest widok GLsurfaceView:

<android.opengl.GLSurfaceView android:id="@+id/glsurfaceview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

Następnie można odwołać się do obiektu B w działalności A, ponieważ został nadmuchany po setContentView do A zamiast B:

GLSurfaceView glSurfaceView = (GLSurfaceView) findViewById(R.id.glsurfaceview); 


glSurfaceView.setRenderer(); //no longer have to pass the object 

szczerze mówiąc, nie wiem, jak zmusić go do pracy dokładnie tak, jak chcesz, ale w Twoim przypadku nie jestem pewien, że ostatecznie robi różnicę. Z drugiej strony, wciąż jestem nowicjuszem. Byłbym zainteresowany, aby dowiedzieć się, jak to zrobić w alternatywny sposób, ponieważ zadałem podobne pytanie właśnie dzisiaj.

+0

Nie jestem pewien, czy rozumiem Twoją propozycję modyfikacji XML. Czy to nie jest dokładnie to samo co mój XML (ten, który wycinam i wklejam z przykładu SurfaceViewOverlay)? Moim głównym problemem jest to, że kliknięcia nie przechodzą do metody onTouchEvent() Bobjecta. Wierzę, że wynika to z faktu, że używam go jako renderera, a nie obiektu SurfaceViewObject. Użyty obiekt SurfaceViewObject jest obiektem zwróconym przez findViewById(). –

+0

Przeczytaj uważnie, nie zamierzam go zmieniać, proponuję zmienić GDZIE umieścisz to. Umieść XML widoku powierzchniowego w układzie A zamiast B i nadmuchaj A. Nie ma potrzeby nadmuchiwania tylko układu B tak, jak robisz, kiedy A zawiera wszystkie twoje widoki. – user432209

+0

Nadal go nie rozumiem. Nie używam już setContentView (Bobject). Podążam za przykładem z SDK. Używam: setContentView (R.layout.surface_view_overlay); Chciałbym użyć opcji Bobject zamiast R.layout.surface_view_overlay, ale to nie pokazuje żadnych przycisków. –