Android開發(fā)之OpenGL繪制2D圖形的方法分析
本文實(shí)例講述了Android開發(fā)之OpenGL繪制2D圖形的方法。分享給大家供大家參考,具體如下:
Android為OpenGL ES支持提供了GLSurviceView組建,這個(gè)組建用于顯示3D圖形。GLSurviceView本身并不提供繪制3的圖形的功能,而是由GLSurfaceView.Renderer來完成了SurviceView中3D圖形的繪制。
歸納起來,在android中使用OpenGL ES需要3個(gè)步驟。
1. 創(chuàng)建GLSurviceView組件,使用Activity來顯示GLSurfaceView組件。
2. 為GLSurviceView組件創(chuàng)建GLSurviceView.Renderer
實(shí)例,實(shí)現(xiàn)GLSurviceView.Renderer類時(shí)需要實(shí)現(xiàn)該接口里的3個(gè)方法。
(1) abstract void onDrawFrame(GL 10 gl):Renerer對象調(diào)用該方法繪制GLSurviceView的當(dāng)前幀。
(2) abstract void onSurfaceChanged(GL 10 gl,int width,int height):當(dāng)GLSurfaceView的大小改變時(shí)回調(diào)該方法。
(3) abstract void onDrawFrame(GL 10 gl,EGLConfig config):當(dāng)GLSurfaceView被創(chuàng)建時(shí)回調(diào)該方法。
3. 調(diào)用GLSurfaceView組件的setRebderer()
方法指定Renderer對象,該Renderer對象將會(huì)完成GLSurfaceView里3D圖像的繪制。
從上面的介紹不難看出,實(shí)際上繪制3D圖像的難點(diǎn)不是如何使用GLSurface組件,二是如何實(shí)現(xiàn)Renderer類。實(shí)現(xiàn)Render類時(shí)需要實(shí)現(xiàn)3個(gè)方法。這3個(gè)方法都有一個(gè)GL形參,它就代表了GLOpenES的“繪制畫筆”,我們可以把它想象成Swing 2D繪圖中的Graphics,也可以想象成Android 2D繪圖中的Canvas組件——當(dāng)我們希望renderer繪制3D圖形時(shí),實(shí)際上是調(diào)用GL10的方法來進(jìn)行繪制的。
當(dāng)Survice View被創(chuàng)建時(shí),系統(tǒng)會(huì)回調(diào)Renderer對象的onSurfaceCreated()方法,該方法將可以對OpenGL ES執(zhí)行一些無需任何改變的初始化,例如如下初始化代碼:
public void OnSurfaceCreated(GL10 gl,EGLConfig config) { //關(guān)閉抗抖動(dòng) gl.glDisable(GL10.GL_DITHER); //設(shè)置系對透視進(jìn)行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(0, 0, 0, 0); //設(shè)置陰影平滑模式 gl.glShadeModel(GL10.GL_SMOOTH); //啟用深度測試 gl.glEnable(GL10.GL_DEPTH_TEST); //設(shè)置深度測試的類型 gl.glDepthFunc(GL10.GL_LEQUAL); }
GL10就是OpenGL ES的繪制接口,雖然這里看到的是一個(gè)GL10,但實(shí)際上它也是GL11的實(shí)例,讀者可通過(gl instanceof GL11)判斷它是否為GL11接口的實(shí)例。
上面的方法中用到了GL10的一些初始化方法,關(guān)于這些方法的說明如下:
(1) GlDisable(int cap)
:該方法用于禁用OpenGL ES某個(gè)方面的特性。該方法中第一行代碼用于關(guān)閉抗抖動(dòng),這樣可以提高性能。
(2)glHint(int target,int mode)
:該方法用于對OpenGL ES某方面的修正。
(3)clearColor(float red,float green,float blue,float alpha)
:該方法設(shè)置清屏所用的顏色,四個(gè)參數(shù)分別設(shè)置紅、綠、藍(lán)、透明度值:0為最小值,1為最大值。例如設(shè)置gl.glClearColor(0,0,0,0);就是用黑色清屏。
(4)glShadeModel(int mode)
:該方法用于設(shè)置OpenGL ES的陰影模式。此處設(shè)為陰影平滑模式。
(5)glEnable(int cap)
:該方法與glDisable(int cap)方法相對,用于啟用OpenGL ES某方面的特性,此處用于啟動(dòng)OpenGL ES的深度測試,就是讓OpenGL ES負(fù)責(zé)跟蹤每個(gè)物體在Z軸上的深度,這樣就可以避免后面的物體遮擋前面的物體。
當(dāng)SurviceView組建的大小發(fā)生變化時(shí),系統(tǒng)會(huì)回調(diào)Renderer對象的onSurfaceChanged()方法,因此該方法通常用于初始化3D場景。例如如下初始化代碼:
public void onSurfaceChanged(GL10 gl,int width,int height) { //設(shè)置3D視窗的大小和位置 gl.glViewport(0,0,width,height); //將當(dāng)前矩陣模式設(shè)為投影矩陣 gl.glMatrixMode(GL10.GL_PROJECTION); //初始化單位矩陣 gl.glLoadIdentity(); //計(jì)算透視視窗的寬度、高度比 float ratio = (float)width/height; //調(diào)用此方法設(shè)置透視視窗的空間大小 gl.glFrustumf(-ratio,ratio,-1,1,1,10); }
上面的方法用到了GL10的一些初始化方法,關(guān)于這些方法的說明如下:
1、 glViewport(int x,int y,int width,int height)
:設(shè)置3D視窗的位置與大小。其中前兩個(gè)參數(shù)指定該視窗的位置,后兩個(gè)參數(shù)指定該視窗的寬,高。
2、glMatrixMode(int mode)
:設(shè)置視圖的矩陣模型。通??山邮蹽L10.GL_PROJECTION、GL10.GL_MODELVIEW兩個(gè)常量值。
當(dāng)調(diào)用glMatrixMode(GL 10.GL_PROJECTION);
代碼后,指定將屏幕設(shè)為透視圖,這意味著越遠(yuǎn)的東西看起來越小;當(dāng)調(diào)用glMatrixMode(GL 10. GL_MODELVIEW);
代碼后,即將當(dāng)前矩陣模式設(shè)為模式視圖矩陣,這意味著任何新的變換都會(huì)影響該矩陣中的所有物體。
3、glLoadIdentity()
:相當(dāng)于reset()方法,用于初始化單位矩陣。
4、glFrustumf(float left,float right,float bottom,float top,float zNear,float zFar)
:用于設(shè)置透視投影的空間大小。前兩個(gè)參數(shù)用于設(shè)置X軸上的最小坐標(biāo)值、最大坐標(biāo)值;中間兩個(gè)參數(shù)用于設(shè)置Y軸上的最小坐標(biāo)值、最大坐標(biāo)值;后兩個(gè)參數(shù)用于設(shè)置Z軸上的最小坐標(biāo)值、最大坐標(biāo)值。
例如我們調(diào)用如下代碼:
gl.glFrustumf(-0.8,0.8,-1,1,1,10);
這意味著如果有一個(gè)二維矩形,它的四個(gè)頂點(diǎn)的坐標(biāo)分別為:(-0.8,1)、(0.8,1)、(0.8,-1),(-0.8,-1),這個(gè)矩陣將會(huì)占滿整個(gè)視窗。
GLSurfaceView上的所有3D圖形都是由Renderer的onDrawFrame(GL10 gl)
方法繪制出來的,重寫該方法時(shí)就要把所有3D圖形都繪制出來,該方法通常以如下形式開始:
public void onDrawFrame(GL10 gl) { //清除屏幕緩存和深度緩存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT); ... }
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android圖形與圖像處理技巧總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- Android開發(fā) OpenGL ES繪制3D 圖形實(shí)例詳解
- Android openGl 繪制簡單圖形的實(shí)現(xiàn)示例
- Android編程開發(fā)之在Canvas中利用Path繪制基本圖形(圓形,矩形,橢圓,三角形等)
- Android編程之canvas繪制各種圖形(點(diǎn),直線,弧,圓,橢圓,文字,矩形,多邊形,曲線,圓角矩形)
- Android自定義View實(shí)現(xiàn)shape圖形繪制
- Android開發(fā)實(shí)現(xiàn)各種圖形繪制功能示例
- Android自定義控件繪制基本圖形基礎(chǔ)入門
- android繪制幾何圖形的實(shí)例代碼
- Android shape 繪制圖形的實(shí)例詳解
- Android中常見的圖形繪制方式總結(jié)
相關(guān)文章
Android開機(jī)自啟動(dòng)服務(wù)的實(shí)現(xiàn)方法
Android開機(jī)自啟動(dòng)服務(wù)的實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-05-05Android獲取當(dāng)前運(yùn)行的類名或者方法
這篇文章主要介紹了Android獲取當(dāng)前運(yùn)行的類名或者方法,涉及Android操作類與方法的技巧,需要的朋友可以參考下2015-05-05ActivityManagerService廣播并行發(fā)送與串行發(fā)送示例解析
這篇文章主要為大家介紹了ActivityManagerService廣播并行發(fā)送與串行發(fā)送示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Flutter利用Canvas模擬實(shí)現(xiàn)微信紅包領(lǐng)取效果
這篇文章主要為大家詳細(xì)介紹了如何利用Flutter中的Canvas模擬實(shí)現(xiàn)微信紅包領(lǐng)取的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-03-03eclipse導(dǎo)入appcompat項(xiàng)目報(bào)錯(cuò)解決辦法
這篇文章主要介紹了eclipse導(dǎo)入appcompat項(xiàng)目報(bào)錯(cuò)解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04Android編程之在SD卡上進(jìn)行文件讀寫操作實(shí)例詳解
這篇文章主要介紹了Android編程之在SD卡上進(jìn)行文件讀寫操作的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android的文件操作及針對SD卡的存取操作相關(guān)技巧,需要的朋友可以參考下2015-12-12詳解Android USB轉(zhuǎn)串口通信開發(fā)基本流程
本篇文章主要介紹了Android USB轉(zhuǎn)串口通信開發(fā)基本流程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04