2

我在最近的一本書(學習OpenGL ES的手機遊戲和圖形開發)中的例子,並建議在主要活動中編程添加一個新的佈局(讓我們稱之爲settingsLayout),然後:覆蓋GLSurfaceView上的xml佈局的最佳做法?

LayoutInflater settingsInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View settingsLayoutView = settingsInflater.inflate(R.layout.mySettingsLayout,settingsLayout,false); 
settingsLayout.addView(settingsLayoutView); 
addContentView(settingsLayout,settingsLayoutParams); 

這工作正常,但我已經將它添加到我的一個操作欄菜單項的回調中,並且我希望能夠在使用後退按鈕時刪除此視圖。到目前爲止,這導致我很頭痛。同時,似乎實現動態視圖的最自然的方式(可以添加到backstack等)是通過Fragments實現的。但是,片段需要屬於佈局,目前我的代碼直接將GLSurfaceView作爲我的主要活動的內容視圖分配,而根本不使用佈局。由於GLSurfaceView是View(而不是View Group)的子類,因此我無法使用它來產生子片段等子元素。

本書的作者聲稱,這種方法是「圓滑」的,但沒有給出任何其他原因直接將GLSurfaceView指定爲內容視圖。是否有性能問題需要注意?或者,讓我的GLSurfaceView和後來衍生的視圖都屬於「主」佈局,就像「圓滑」一樣?

有沒有其他一些更自然的方法讓按鈕,文本框等動態地出現和消失在我的GLSurfaceView之上?

+0

現在我已經創建了一個單獨的佈局作爲「主機」視圖組,然後在該佈局中我有一個片段,其中我的GLSurfaceView獲取setContentView。其他片段然後以編程方式在頂部創建。這似乎是有效的,但我仍然想知道,如果這是最好的方式,性能明智。 – djphd

回答

1

我不確定你的具體性能問題是什麼 - 渲染視圖對象或渲染GL?你所做的任何事情都不會影響GL渲染的性能(除了可能改變窗口的大小)。

SurfaceViewGLSurfaceView在View層次結構中提供透明的「佔位符」,其他元素在計算佈局時使用,但實際像素繪製在單獨的圖層上。這就是爲什麼SurfaceView要麼位於所有視圖元素後面,要麼位於所有視圖元素的前面 - 該圖層被傳遞給系統合成器(SurfaceFlinger),該系統合成器負責生成最終的顯示圖像。

+0

我最初擔心某個像素被繪製的次數。我仍然在學習硬件如何處理所有這些東西。這澄清了我讀過的一些東西,謝謝!我的片段解決方案似乎運行良好,我沒有注意到任何放緩。 – djphd