編輯:關於Android編程
OpenGL ES
Android包括高性能2D和3D圖形開放圖形庫(OpenGL?的),具體而言,OpenGL ES的API支持。 OpenGL是一個跨平台的圖形API,用於指定的3D圖形處理硬件標准的軟件接口。 ES是用於嵌入式設備的OpenGL規范的味道??。 Android支持OpenGL ES的API的幾個版本:
的OpenGL ES 1.0和1.1 - 本API規范是由Android 1.0及更高版本支持。
OpenGL ES 2.0的 - 這個API規范由Android 2.2的(API 8級)或更高版本支持。
的OpenGL ES 3.0 - 本API規范是由Android 4.3(API級別18)和更高的支持。
的OpenGL ES 3.1 - 這個API規范由是Android 5.0(API級別21)和更高的支持。
注意:在設備上的OpenGL ES 3.0 API的支持,需要由設備制造商提供了這個圖形管線的實現。運行Android 4.3或更高版本的設備可能不支持的OpenGL ES 3.0 API。有關檢查在運行時支持哪些版本的OpenGL ES的信息,請參閱檢查OpenGL ES版本。
注意:由Android框架所提供的特定的API是類似於J2ME JSR239 OpenGL ES的API,但是是不相同的。如果您熟悉J2ME JSR239規范,對變化的警報。
基礎
Android的支持OpenGL既通過其框架API和原生開發套件(NDK)。本主題重點介紹了Android框架接口。有關NDK的更多信息,請參閱的Andr??oid NDK。
有兩個基礎班在Android框架,讓您創建和操縱符合OpenGL ES API的圖形:GLSurfaceView和GLSurfaceView.Renderer。如果你的目標是使用OpenGL在你的Andr??oid應用程序,了解如何實現一個活動,這些類應該是你的第一個目標。
GLSurfaceView
這個類是一個視圖,你可以繪制和操作使用OpenGL API調用的對象,並在功能上SurfaceView類似。您可以通過創建GLSurfaceView的實例,並增加你的渲染它使用這個類。但是,如果你想捕捉觸摸屏事件,您應該擴展GLSurfaceView類來實現觸摸監聽器,如圖OpenGL的訓練課中,響應觸摸事件。
GLSurfaceView.Renderer
此接口定義在GLSurfaceView繪制圖形所需要的方法。你必須提供這個接口作為一個單獨的類的實現,並使用GLSurfaceView.setRenderer其附加到您GLSurfaceView實例()。
該GLSurfaceView.Renderer接口,您需要實現以下方法:
onSurfaceCreated():創建GLSurfaceView時,系統調用這個方法一次。使用此方法來執行只需要發生一次的操作,如設置OpenGL的環境參數或初始化的OpenGL圖形對象。
onDrawFrame()系統調用的GLSurfaceView每個重繪此方法。使用此方法作為主要執行點繪制(並重新繪制)圖形對象。
onSurfaceChanged()系統調用此方法時,GLSurfaceView幾何變化,包括在GLSurfaceView的大小或設備屏幕的方向變化。例如,當設備從縱向變為橫向系統調用此方法。使用此方法可以在GLSurfaceView容器的變化做出反應。
OpenGL ES的包
一旦你建立了使用GLSurfaceView和GLSurfaceView.Renderer為OpenGL ES的容器視圖,您可以開始使用下面的類中調用OpenGL的API:
的OpenGL ES 1.0 / 1.1 API包
android.opengl - 這個包提供了一個靜態的界面比javax.microedition.khronos封裝接口的OpenGL ES 1.0 / 1.1類和更好的性能。
GLES10
GLES10Ext
GLES11
GLES11Ext
javax.microedition.khronos.opengles - 此軟件包提供了標准實施的OpenGL ES 1.0 / 1.1。
GL10
GL10Ext
GL11
GL11Ext
GL11ExtensionPack
的OpenGL ES 2.0 API類
android.opengl.GLES20 - 此軟件包提供接口的OpenGL ES 2.0,並開始提供Android 2.2的(API級別8)。
的OpenGL ES 3.0 / 3.1 API包
android.opengl - 此軟件包提供了接口的OpenGL ES 3.0 / 3.1類。 3.0版開始提供的Andr??oid 4.3(API等級18)。 3.1版開始提供的是Android 5.0(API等級21)。
GLES30
GLES31
GLES31Ext(Android的擴展包)
如果你想開始建設有OpenGL ES的應用程序向右走,遵循的OpenGL ES類顯示圖形。
聲明要求的OpenGL
如果應用程序使用的OpenGL功能,這些功能並非適用於所有的設備,你必須在你的Andr??oidManifest.xml文件這些要求。以下是最常見的OpenGL清單的聲明:
OpenGL ES版本的要求 - 如果你的應用需要OpenGL ES的特定版本,您必須通過如下圖所示添加以下設置你的清單聲明要求。
對於OpenGL ES 2.0的:
添加此聲明將使谷歌播放從被安裝在不支持OpenGL ES2.0標准的設備將應用程序限制。如果應用程序是專為支持的OpenGL ES3.0的設備,你也可以在你的清單中指定的:
For OpenGL ES 3.1:
注:的OpenGL ES API 3.X與2.0 API,這意味著你可以與你的應用程序中實現的OpenGL ES的更靈活的向後兼容。通過聲明的OpenGL ES 2.0 API作為您清單的要求,您可以使用該API版本作為默認,檢查在運行時API 3.X的可用性,然後如果設備支持使用OpenGL ES 3.x的功能它。有關檢查設備所支持的OpenGL ES版本的更多信息,請參閱檢查OpenGL ES版本。
圖1.默認OpenGL的坐標系(左)映射到一個典型Android裝置畫面(右)。
上面的圖顯示了統一協調假設左側一個OpenGL框架體系,以及如何將這些坐標實際上映射到一個典型的設備屏幕在右側橫向。為了解決這個問題,你可以申請OpenGL的投影模式和相機意見,使您的圖形對象具有在任何顯示器上以正確的比例轉換坐標。
為了運用投影和相機視圖,您創建一個投影矩陣,攝像機視圖矩陣,並將其應用到OpenGL渲染管線。使他們正確地映射到Android設備屏幕的投影矩陣重新計算圖形的坐標。攝像機視圖矩陣創建從一個特定的眼睛位置渲染對象的變換。
在OpenGL ES 1.0投影和相機視圖
在ES 1.0 API,通過創建每個矩陣,然後將其添加到OpenGL的環境中應用投影和相機視圖。
投影矩陣 - 為了重新計算對象創建使用該設備屏幕的幾何形狀的投影矩陣坐標,以便他們繪制的正確比例。下面的示例代碼演示了如何修改GLSurfaceView.Renderer實施onSurfaceChanged()方法來創建基於屏幕的寬高比的投影矩陣,並將其應用到OpenGL渲染環境。
public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); // make adjustments for screen ratio float ratio = (float) width / height; gl.glMatrixMode(GL10.GL_PROJECTION); // set matrix to projection mode gl.glLoadIdentity(); // reset the matrix to its default state gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection matrix }相機變換矩陣 - 一旦你使用調整投影矩陣坐標系統,您還必須應用攝影機視圖。下面的示例代碼顯示了如何修改GLSurfaceView.Renderer實施onDrawFrame()方法來應用模型視圖,並使用GLU.gluLookAt()實用程序來創建一個模擬攝像機的位置觀看的轉變。
public void onDrawFrame(GL10 gl) { ... // Set GL_MODELVIEW transformation mode gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // reset the matrix to its default state // When using GL_MODELVIEW, you must set the camera view GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); ... }在OpenGL ES 2.0的和更高的投影和相機視圖
private final String vertexShaderCode = // This matrix member variable provides a hook to manipulate // the coordinates of objects that use this vertex shader. "uniform mat4 uMVPMatrix; \n" + "attribute vec4 vPosition; \n" + "void main(){ \n" + // The matrix must be included as part of gl_Position // Note that the uMVPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. " gl_Position = uMVPMatrix * vPosition; \n" + "} \n";注:上面的例子定義了一個變換矩陣成員在其中應用組合投影矩陣和攝像機視圖矩陣頂點著色器。根據您的應用需求,您可能要定義你的頂點著色器單獨的投影矩陣和攝像機觀察矩陣的成員,以便可以獨立改變它們。
public void onSurfaceCreated(GL10 unused, EGLConfig config) { ... muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); ... }創建投影和相機的觀看矩陣 - 生成的投影和觀察矩陣要應用的圖形對象。下面的示例代碼顯示了如何修改GLSurfaceView.Renderer實施onSurfaceCreated()和onSurfaceChanged()方法來創建攝像機視圖矩陣,並根據設備的屏幕高寬比的投影矩陣。
public void onSurfaceCreated(GL10 unused, EGLConfig config) { ... // Create a camera view matrix Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); float ratio = (float) width / height; // create a projection matrix from device screen geometry Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); }應用投影和鏡頭視角矩陣 - 要應用投影和相機視圖變換,乘矩陣一起,然後將其設置到頂點著色器。下面的示例代碼顯示了如何修改GLSurfaceView.Renderer實施onDrawFrame()方法,在上面的代碼創建的投影矩陣和攝像機視圖結合起來,然後將其應用於通過的OpenGL渲染圖形對象。
public void onDrawFrame(GL10 unused) { ... // Combine the projection and camera view matrices Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); // Apply the combined projection and camera view transformations GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); // Draw objects ... }有關如何運用投影和相機視圖與OpenGL ES 2.0的一個完整的示例,請參閱使用OpenGL ES的類顯示圖形。
圖1.插圖換算成逆時針順序繪制坐標列表。
在本例中,三角形的點中,使得它們在反時針方向繪制的順序進行定義。在這些坐標被繪制的順序定義了形狀的卷繞方向。默認情況下,在OpenGL,這是逆時針方向繪制面對的是前臉。在圖1所示的三角形被定義,以便你正在尋找的形狀的前表面(由OpenGL作為解釋),而另一側是背面。
為什麼很重要知道哪一個形狀的臉是前面?答案與OpenGL的一個常用的功能,叫做臉撲殺做。面剔除是用於OpenGL的環境,它允許渲染流水線忽略(未計算或繪制)的形狀的背面,節省了時間,存儲器和處理周期一個選項:
// enable face culling feature gl.glEnable(GL10.GL_CULL_FACE); // specify which faces to not draw gl.glCullFace(GL10.GL_BACK);如果您嘗試使用面部特征撲殺不知道,你的形狀,兩側都是正面和背面,你的OpenGL圖形要看看有點薄,或可能顯示不出來的。所以,總是定義一個逆時針繪制順序你的OpenGL圖形的坐標。
String extensions = javax.microedition.khronos.opengles.GL10.glGetString( GL10.GL_EXTENSIONS);
警告:此調用的結果與設備的實際!您必須運行在多個目標設備此調用,以確定哪些類型的壓縮通常支持。
要驗證平台版本支持AEP,使用hasSystemFeature(String)方法,在FEATURE_OPENGLES_EXTENSION_PACK傳遞作為參數。下面的代碼片段顯示了如何做到這一點的例子:
boolean deviceSupportsAEP = getPackageManager().hasSystemFeature (PackageManager.FEATURE_OPENGLES_EXTENSION_PACK);如果該方法返回true,AEP支持。
private static double glVersion = 3.0; private static class ContextFactory implements GLSurfaceView.EGLContextFactory { private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; public EGLContext createContext( EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { Log.w(TAG, "creating OpenGL ES " + glVersion + " context"); int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, (int) glVersion, EGL10.EGL_NONE }; // attempt to create a OpenGL ES 3.0 context EGLContext context = egl.eglCreateContext( display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); return context; // returns null if 3.0 is not supported; } }如果上述的createContext()方法,顯示返回null,你的代碼應該創建一個OpenGL ES 2.0的范圍內,而不是和回落到只使用該API。
// Create a minimum supported OpenGL ES context, then check: String version = javax.microedition.khronos.opengles.GL10.glGetString( GL10.GL_VERSION); Log.w(TAG, "Version: " + version ); // The version format is displayed as: "OpenGL ES通過這種方法,如果您發現該設備支持更高級別的API版本,您必須銷毀最小的OpenGL ES的背景下,並創建一個新的上下文具有較高可用的API版本。. " // followed by optional content provided by the implementation.
在Android中實現異步任務機制有兩種方式,Handler和AsyncTask。Handler模式需要為每一個任務創建一個新的線程,任務完成後通過Handler實例向U
Pausing and Resuming an Activity 暫停和恢復一個activityThis lesson teaches you to 這節課教給你Paus
仿微信5.2布局,本實例默認編碼GBK。需要的朋友可以研究一下。 【點擊下載】
一、通訊錄介紹 通訊錄是Android手機自帶的一個應用,它是一個ContentProvider應用,其它應用可以對通訊錄進行訪問,進行對聯系人的CRUD操作。 二、