2010-11-08 17 views
6

Ben bir Android OpenGL uygulamasını başladı ve şu sınıfları:Android glSurfaceView/Java

sınıf A'nın onCreate çağrıldığında, bu tip B sınıfı bir nesne oluşturur ve çağrıları
class A extends Activity 
class B extends GlSurfaceView implements Renderer 

:

Şimdiye kadar çalışıyor ve birkaç gün geçirdim.

Artık uygulamamın içine düğmeler eklemek istedim ve SurfaceViewOverlay örneğini buldum. Bu bir görünüm hiyerarşisi oluşturmak için bazı XML kullanır. nasıl görüşlerimi başlatmak olacağını,

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

Şimdi akılda benim orijinal sınıf hiyerarşisi tutarak: Ben XML kodu I çok benzer bir şekilde basitçe kesilmiş oluşturmak ve yapıştırmak istedi? A sınıfımın onCreate() 'ına ne yazmalıyım?

kullanıyorum çalıştı:

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

Ve düğmeleri ve ekranda GL görünümünü çizmek, ama GL görünüm muslukları/tıklama herhangi bir giriş de alamaması. Bobject en onTouchEvent() olarak adlandırılır, çünkü bu sadece olarak kullanılıyor olarak

Bu olasıdır:

Renderer 

ve bir:

glSurfaceView 

nesne.

Yukarıdaki kod yerine, gerçekten istediğim şey, Bobject'in glSurfaceView öğesini değiştirmesidir. Ama bunu nasıl yapacağımı bilmiyorum. SeeViewById() öğesini bulduğumda, glSurfaceView zaten şimdilik oluşturulmuş gibi görünüyor. GL görünümü için B tipi bir nesneyi kullanmayı nasıl isteyebilirim?

Herhangi bir yeni kullanıcı hatası için üzgünüz. Android için tamamen yeni.

DÜZENLEME:

şunlarla çalıştı: Ben de bu çalıştı

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

Ve seni arıyorum benim bir sınıf yapıcısı: Benim XML dosyasında , ben GLSurfaceView değiştirdi:

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

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

XML dosyasımda/Activity'ımda glSurfaceView öğesini genişleten özel sınıfımı nasıl kullanmalıyım?

+1

Aynı sorunla uğraştım ve bu şeyi gösteren bir uygulama bulamadım. Birisi örnek bir uygulama gösterebilir mi? Her yerde android örnekleri bu ünlü SurfaceOverlayView örneğini bulmak için görünmüyor olabilir. Şimdiden teşekkürler. – rgngl

cevap

7

Tamam, bunu yapmanın en uygun yolu alır B sınıfında bir kurucu sahip olmaktır:

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

Ve XML düzeninde, bunu kullanın:

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

Benim kodumda eksik olan şey kurucu imzasıydı.

+0

Aynı şeyi eklediğimde "Oluşturucu Nesnesi (Bağlam, AttributeSet) undefined" Bana rehberlik edebilir misiniz? – JehandadK

+0

Renderer sınıfına ekledim. – JehandadK

+0

Büyük teşekkürler, çok yardımcı – zest

1

Bunu çözmenin alternatif bir yolu, Görünümlerinizin Etkinlik A'ya eklenmesini sağlamaktır., Daha sonra Aktivite A, B nesnesine başvurabilir

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

: Bunun yerine setContentView (B nesnesi) Eğer setContentView (A nesne) ve "A XML" dosyası içinde kullanmak kullanmak yerine, GLsurfaceView görünümüdür

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


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

dürüst tam olarak istediğiniz şekilde çalışmaya nasıl emin değilim, ama senin durumunda ben sonuçta bunu emin değilim: Eğer A'ya setContentView zaman yerine B'nin, şişirilmiş çünkü bir fark yaratıyor. Sonra yine ben de acemiim. Hemen bugün benzer bir soru sorduğumda bunu nasıl alternatif bir şekilde yapacağımı öğrenmek isterdim.

+0

XML değişiklik teklifinizi anladığımdan emin değilim. Bu benim XML'imle aynı değil mi (SurfaceViewOverlay örneğinden kes ve yapıştırdığım)? Temel sorunum, tıklamaların Bobject'in onTouchEvent() yöntemine geçmemesidir. Bunun bir Renderer ve SurfaceViewObject olarak kullanılmamasından kaynaklandığına inanıyorum. Kullanıyorum SurfaceViewObject findViewById() tarafından döndürülen bir. –

+0

Dikkatlice okuyun, değiştirmeyi önermiyorum, koydum WHERE'yi değiştirmeyi teklif ediyorum. Yüzey görünümü XML'ini A'nın mizanpajı yerine B'ye yerleştirin ve A'yı şişirin. A, tüm görünümlerinizi içerdiğinde, yaptığınız gibi yalnızca B düzenini şişirmeye gerek yoktur. – user432209

+0

Hala anlamadım. Artık setContentView (Bobject) kullanmıyorum. SDK örneğini takip ediyorum. Kullanıyorum: setContentView (R.layout.surface_view_overlay); R.layout.surface_view_overlay yerine Bobject kullanmayı çok isterim, ancak bu herhangi bir tuş göstermiyor. –