編輯:高級開發
1、提供粘合代碼把OpenGL ES連接到你的視圖系統
2、提供粘合代碼使得OpenGL ES按照Acticity(活動)的生命周期工作
3、使它容易選擇一款合適的框架緩沖區像素格式
4、創建和管理一個獨立的渲染線程,產生平滑的動畫
5、提供更容易使用的調試工具來跟蹤OpenGL ES 的API 並能找出錯誤。
GLSurfaceVIEw是一個很好的基類對於構建一個使用OpenGL ES進行部分或全部渲染的應用程序。一個2D或3D的動作游戲就是一個很好的例子,例如一個2D或3D的可視化應用如谷歌地圖。
以下是一個簡單的GLSurfaceVIEw的應用:
一個最簡單的OpenGL ES應用代碼如下:
package com.Javaeye.googlers
import Javax.microedition.khronos.egl.EGLConfig;
import Javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.opengl.GLSurfaceVIEw;
import android.os.Bundle;
public class ClearActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new GLSurfaceVIEw(this);
mGLVIEw.setRenderer(new ClearRenderer());
setContentView(mGLVIEw);
}
@Override
protected void onPause() {
super.onPause();
mGLVIEw.onPause();
}
@Override
protected void onResume() {
super.onResume();
mGLVIEw.onResume();
}
private GLSurfaceView mGLVIEw;
}
class ClearRenderer implements GLSurfaceVIEw.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Do nothing special.
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glVIEwport(0, 0, w, h);
}
public void onDrawFrame(GL10 gl) {
接上頁
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
}
這個程序並沒有做太多東西:它在每幀是清除屏幕到黑色。但是它是一個完整的OpenGL應用程序,正確地按照Activity(活動)的生命周期實現。當活動暫停渲染它也暫停渲染,活動恢復它也恢復。你可以把這個例子作為一個基本的交互的示例程序。僅僅更多地調用了 ClearRenderer.onDrawFrame() 方法。注意你甚至不需要子類化一個GLSurfaceVIEw視圖。
GLSurfaceVIEw.Renderer 有三個方法:
onSurfaceCreated() :在開始渲染的時候被調用,無論什麼時候OpenGL ES 渲染不得不重新被創建。(渲染是典型的丟失並重新創建當活動被暫停或恢復。)該方法一個創建長生命周期OpenGL資源(如材質)的好地方。
onSurfaceChanged():該方法在surface大小改變時被調用。這是設置你opengl視圖端的好地方。如果相機是固定的,不會圍著場景移動,你也可以在這裡設置你的相機。
onDrawFrame():每幀的時候該方法都會被調用,這個用於畫場景是可靠的。你完全可以通過調用glClear方法開清楚幀緩存,接著通過其他的opengl ES來調用畫當前的場景。
用戶如何輸入?
假如你想做一個可以交互的程序(如游戲),通常你會實現GLSurfaceVIEw子類,因為這是很容易獲取用戶輸入事件。以下代碼是一個清晰的長例子展示給你怎樣做到這個:
package com.Javaeye.googlers;
import Javax.microedition.khronos.egl.EGLConfig;
import Javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.content.Context;
import android.opengl.GLSurfaceVIEw;
import android.os.Bundle;
import android.vIEw.MotionEvent;
public class ClearActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new ClearGLSurfaceVIEw(this);
setContentView(mGLVIEw);
}
@Override
protected void onPause() {
super.onPause();
mGLVIEw.onPause();
接上頁
}
@Override
protected void onResume() {
super.onResume();
mGLVIEw.onResume();
}
private GLSurfaceView mGLVIEw;
}
class ClearGLSurfaceView extends GLSurfaceVIEw {
public ClearGLSurfaceVIEw(Context context) {
super(context);
mRenderer = new ClearRenderer();
setRenderer(mRenderer);
}
public boolean onTouchEvent(final MotionEvent event) {
queueEvent(new Runnable(){
public void run() {
mRenderer.setColor(event.getX() / getWidth(),
event.getY() / getHeight(), 1.0f);
}});
return true;
}
ClearRenderer mRenderer;
}
class ClearRenderer implements GLSurfaceVIEw.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Do nothing special.
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glVIEwport(0, 0, w, h);
}
public void onDrawFrame(GL10 gl) {
gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
public void setColor(float r, float g, float b) {
mRed = r;
mGreen = g;
mBlue = b;
}
private float mRed;
private float mGreen;
private float mBlue;
}
這個應用每幀都在清楚屏幕。當你點擊屏幕時,它清除顏色基於你觸屏時間的X、Y坐標。注意在 ClearGLSurfaceVIEw.onTouchEvent()中使用queueEvent()。queueEvent()方法被安全地用於在UI 線程和渲染線程之間進行交流。如果你願意,你還可以使用一些其他的Java線程間交流技術,例如Renderer 類本身的同步方法。然而,queueing 事件經常是一種用於處理線程間信息交流的更簡單方式。
其他的GLSurfaceVIEw示例:
如果你厭煩了上面的示例,你還可以從android的ApiDemo中找到更經典的示例,所有的openGL ES示例都是用GLSurfaceVIEw視圖轉變的:
GLSurfaceVIEw - 一個旋轉的三角形
Kube - 一個魔方例子
Translucent GLSurfaceVIEw - 展示在一個透明的背景上顯示3d動畫
Textured Triangle - 顯示一個帶紋理的3D三角形
Sprite Text - 展示怎樣用材質畫出文字並混合進一個3d的場景中
Touch Rotate - 展示怎樣旋轉一個3D物體來響應用戶的輸入
Google不做惡,蘋果要作惡?其實刪掉競爭對手的描述,其實也是一種合理的商業手段。只是這樣的要求,顯得蘋果有些不厚道,不知道Google怎麼反擊。iPad的發布,在5
盡管蘋果聯合創始人承認:android將取得最終勝利,不過很多人認為過於開放的環境依然不利於android,無差異的應用體驗正在制約Android超過iPhone。日前
下面文章著重講解界面的android UI部分,基本的操作大家還是了解的,把整個屏幕看做一個二維數組,每一個元素可以視為一個方塊,因此每個方格在游戲進行過程中可以處於不
想要快速獲取android手機的ROOT權限嗎?也許因為ROOT教程太復雜,也許因為不會進工程模式,讓我們在使用android手機時感覺像是開別人的車一樣,總不那麼順手