為了用OpenGL在你的Android應用上繪制圖形,你必須為它們創建一個視圖容器。創建視圖容器更直接的方式之一是繼承GLSurfaceView 和 GLSurfaceView.Renderer。GLSurfaceView 是一個用OpenGL做圖形繪制的視圖容器,GLSurfaceView.Renderer用來控制在視圖畫什么。想了解更多關於這些類的信息,請看OpenGL開發者指導。
GLSurfaceView 只是把OpenGL圖形合到你應用程序中的一種方式。想要全屏或近似全屏的圖形視圖,GLSurfaceView 是一個合理的選擇。開發者如果想把OpenGL圖形合到他們布局的某一小部分布局中,那么應該去看看OpenGL圖形合到TextureView。對於真的想自己做的開發者們,用SurfaceView實現OpenGL ES視圖也是可以的,只不過這需要寫一點額外的代碼。
本文解釋了怎樣在一個簡單的應用Activity中完成GLSurfaceView 和 GLSurfaceView.Renderer的極簡實現。
在注冊文件中聲明OpenGL ES使用
為了能夠在你的應用中使用OpenGL ES 2.0 API,你必須在你的注冊文件中添加如下聲明:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />如果你的應用使用紋理壓縮,那么你也必須聲明你的應用支持那種格式的壓縮,以便於它只會被安裝在兼容的設備上。
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />如果想了解更多關於紋理壓縮格式的信息,請看OpenGL開發文檔。
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
為OpenGL ES圖形創建Activity
就像其他的應用程序有用戶界面一樣,使用OpenGL ES的Android應用也有Activities。與其他應用最主要的不同是你為你的Activity添加什么樣的布局。在許多應用中你或許使用TextView, Button 或 ListView,而在使用OpenGL的應用中你還可以添加一個GLSurfaceView 。
下面的代碼展示了一個使用GLSurfaceView 作為主視圖的一個Activity的極簡實現。
public class OpenGLES20Activity extends Activity {
private GLSurfaceView mGLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a GLSurfaceView instance and set it
// as the ContentView for this Activity.
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
注意:OpenGL ES 2.0需要Android2.2(API 版本為8)或更高的版本,因此請確保你的Android工程的目標版本要為Android2.2以上版本。
建立一個GLSurfaceView對象
GLSurfaceView 是一個專門的可以在上面繪制OpenGL ES圖形的view。它自己不會做太多的事情。真正的繪制工作是你給這個view設置的GLSurfaceView.Renderer中控制的。這個對象的代碼如此的簡短、以至於你可能不去繼承它而自己創造一個沒有修改的GLSurfaceView 的實例,但是不要這么做。為了捕捉觸摸事件,你需要繼承它,這將會在響應觸摸事件的一節中講到。
繼承GLSurfaceView的基本代碼是極簡的,因此對於這樣一個快速實現,它通常是在Activity中作為一個內部類來創建。用法如下:
class MyGLSurfaceView extends GLSurfaceView {另一個針對於你 GLSurfaceView實現的可選添加項是:設置只有在繪圖數據改變的時候才去繪制view的渲染模式。使用GLSurfaceView.RENDERMODE_WHEN_DIRTY 來設置:
private final MyGLRenderer mRenderer;
public MyGLSurfaceView(Context context){
super(context);
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
mRenderer = new MyGLRenderer();
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(mRenderer);
}
}
// Render the view only when there is a change in the drawing data這個設置會防止 GLSurfaceView的幀被重繪直到你調用requestRender(),對於一個簡單的APP這樣會更高效。
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
在一個使用OpenGL ES的應用中實現GLSurfaceView.Renderer類或渲染器,事情將開始變得有趣。這個類將控制用它關聯的內容在GLSurfaceView上繪制什么。渲染器中有三個被Android系統調用的用來計算在GLSurfaceView上畫什么以及怎么畫的方法。
public class MyGLRenderer implements GLSurfaceView.Renderer {這就是所有的了!上面的例程代碼創建了一個用OpenGL顯示一個黑色屏幕的簡單Android應用。只創建這些類,僅僅這些代碼不能做任何非常有趣的事情。你需要奠定基礎去開始用OpenGL繪制圖形元素。
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set the background frame color
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
public void onDrawFrame(GL10 unused) {
// Redraw background color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}
}
注意:也許你會感到奇怪,為什么你用OpenGLES 2.0 APIs時它們會有GL10的參數。這是為了保持Android框架層代碼更簡潔,簡單地復用了這些方法簽名。
如果你已經熟悉了OpenGL ES的APIs,你應該馬上在你的Android應用中創建OpenGL ES環境,並且開始繪制圖形。然而如果你需要更多的幫助去開始OpenGL,請繼續下一節的內容來獲取更多的提示。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。