最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android開(kāi)發(fā)之OpenGL繪制2D圖形的方法分析

 更新時(shí)間:2017年09月05日 10:43:15   作者:pku_android  
這篇文章主要介紹了Android開(kāi)發(fā)之OpenGL繪制2D圖形的方法,結(jié)合實(shí)例形式分析了Android使用OpenGL ES的圖形繪制組件實(shí)現(xiàn)2D圖形繪制的原理、步驟及相關(guān)代碼注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Android開(kāi)發(fā)之OpenGL繪制2D圖形的方法。分享給大家供大家參考,具體如下:

Android為OpenGL ES支持提供了GLSurviceView組建,這個(gè)組建用于顯示3D圖形。GLSurviceView本身并不提供繪制3的圖形的功能,而是由GLSurfaceView.Renderer來(lái)完成了SurviceView中3D圖形的繪制。

歸納起來(lái),在android中使用OpenGL ES需要3個(gè)步驟。

1. 創(chuàng)建GLSurviceView組件,使用Activity來(lái)顯示GLSurfaceView組件。

2. 為GLSurviceView組件創(chuàng)建GLSurviceView.Renderer實(shí)例,實(shí)現(xiàn)GLSurviceView.Renderer類(lèi)時(shí)需要實(shí)現(xiàn)該接口里的3個(gè)方法。

(1) abstract void onDrawFrame(GL 10 gl):Renerer對(duì)象調(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對(duì)象,該Renderer對(duì)象將會(huì)完成GLSurfaceView里3D圖像的繪制。

從上面的介紹不難看出,實(shí)際上繪制3D圖像的難點(diǎn)不是如何使用GLSurface組件,二是如何實(shí)現(xiàn)Renderer類(lèi)。實(shí)現(xiàn)Render類(lèi)時(shí)需要實(shí)現(xiàn)3個(gè)方法。這3個(gè)方法都有一個(gè)GL形參,它就代表了GLOpenES的“繪制畫(huà)筆”,我們可以把它想象成Swing 2D繪圖中的Graphics,也可以想象成Android 2D繪圖中的Canvas組件——當(dāng)我們希望renderer繪制3D圖形時(shí),實(shí)際上是調(diào)用GL10的方法來(lái)進(jìn)行繪制的。

當(dāng)Survice View被創(chuàng)建時(shí),系統(tǒng)會(huì)回調(diào)Renderer對(duì)象的onSurfaceCreated()方法,該方法將可以對(duì)OpenGL ES執(zhí)行一些無(wú)需任何改變的初始化,例如如下初始化代碼:

public void OnSurfaceCreated(GL10 gl,EGLConfig config)
{
  //關(guān)閉抗抖動(dòng)
  gl.glDisable(GL10.GL_DITHER);
  //設(shè)置系對(duì)透視進(jìn)行修正
  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
  gl.glClearColor(0, 0, 0, 0);
  //設(shè)置陰影平滑模式
  gl.glShadeModel(GL10.GL_SMOOTH);
  //啟用深度測(cè)試
  gl.glEnable(GL10.GL_DEPTH_TEST);
  //設(shè)置深度測(cè)試的類(lèi)型
  gl.glDepthFunc(GL10.GL_LEQUAL);
}

GL10就是OpenGL ES的繪制接口,雖然這里看到的是一個(gè)GL10,但實(shí)際上它也是GL11的實(shí)例,讀者可通過(guò)(gl instanceof GL11)判斷它是否為GL11接口的實(shí)例。

上面的方法中用到了GL10的一些初始化方法,關(guān)于這些方法的說(shuō)明如下:

(1) GlDisable(int cap):該方法用于禁用OpenGL ES某個(gè)方面的特性。該方法中第一行代碼用于關(guān)閉抗抖動(dòng),這樣可以提高性能。
(2)glHint(int target,int mode):該方法用于對(duì)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)方法相對(duì),用于啟用OpenGL ES某方面的特性,此處用于啟動(dòng)OpenGL ES的深度測(cè)試,就是讓OpenGL ES負(fù)責(zé)跟蹤每個(gè)物體在Z軸上的深度,這樣就可以避免后面的物體遮擋前面的物體。

當(dāng)SurviceView組建的大小發(fā)生變化時(shí),系統(tǒng)會(huì)回調(diào)Renderer對(duì)象的onSurfaceChanged()方法,因此該方法通常用于初始化3D場(chǎng)景。例如如下初始化代碼:

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)于這些方法的說(shuō)明如下:

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)的東西看起來(lái)越小;當(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ì)占滿(mǎn)整個(gè)視窗。

GLSurfaceView上的所有3D圖形都是由Renderer的onDrawFrame(GL10 gl)方法繪制出來(lái)的,重寫(xiě)該方法時(shí)就要把所有3D圖形都繪制出來(lái),該方法通常以如下形式開(kāi)始:

public void onDrawFrame(GL10 gl)
{
  //清除屏幕緩存和深度緩存
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
  ...
}

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android圖形與圖像處理技巧總結(jié)》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Android ViewPager實(shí)現(xiàn)頁(yè)面左右切換效果

    Android ViewPager實(shí)現(xiàn)頁(yè)面左右切換效果

    這篇文章主要為大家詳細(xì)介紹了Android ViewPager實(shí)現(xiàn)頁(yè)面左右切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android實(shí)現(xiàn)仿網(wǎng)易新聞的頂部導(dǎo)航指示器

    Android實(shí)現(xiàn)仿網(wǎng)易新聞的頂部導(dǎo)航指示器

    這篇文章主要介紹了Android實(shí)現(xiàn)仿網(wǎng)易新聞的頂部導(dǎo)航指示器的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • Android實(shí)現(xiàn)壓縮字符串的方法示例

    Android實(shí)現(xiàn)壓縮字符串的方法示例

    最近在做Android開(kāi)發(fā),遇到了需要壓縮字符串的功能,下面這篇文章主要給大家介紹了Android實(shí)現(xiàn)壓縮字符串的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Android實(shí)現(xiàn)TCP客戶(hù)端接收數(shù)據(jù)的方法

    Android實(shí)現(xiàn)TCP客戶(hù)端接收數(shù)據(jù)的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)TCP客戶(hù)端接收數(shù)據(jù)的方法,較為詳細(xì)的分析了Android基于TCP實(shí)現(xiàn)客戶(hù)端接收數(shù)據(jù)的相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下
    2016-04-04
  • Android編程實(shí)現(xiàn)下載時(shí)主界面與詳細(xì)界面一致更新的方法

    Android編程實(shí)現(xiàn)下載時(shí)主界面與詳細(xì)界面一致更新的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)下載時(shí)主界面與詳細(xì)界面一致更新的方法,涉及Android事件監(jiān)聽(tīng)及界面動(dòng)態(tài)更新相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • android之camera用法實(shí)例詳解

    android之camera用法實(shí)例詳解

    這篇文章主要介紹了android之camera用法,以實(shí)例形式較為詳細(xì)的分析了Android使用camera拍照的相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下
    2015-09-09
  • Android Studio實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車(chē)功能

    Android Studio實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車(chē)功能

    這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車(chē),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android SQLite數(shù)據(jù)庫(kù)連接實(shí)現(xiàn)登錄功能

    Android SQLite數(shù)據(jù)庫(kù)連接實(shí)現(xiàn)登錄功能

    這篇文章主要為大家詳細(xì)介紹了Android SQLite數(shù)據(jù)庫(kù)連接實(shí)現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Android基于高德地圖poi的仿微信獲取位置功能實(shí)例代碼

    Android基于高德地圖poi的仿微信獲取位置功能實(shí)例代碼

    這篇文章主要介紹了Android基于高德地圖poi的仿微信獲取位置功能,當(dāng)用戶(hù)打開(kāi)頁(yè)面自動(dòng)定位,同時(shí)搜索周邊所有poi,點(diǎn)擊搜索按鈕輸入關(guān)鍵字,獲取關(guān)鍵字搜索結(jié)果,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-12-12
  • Android學(xué)習(xí)之Broadcast的簡(jiǎn)單使用

    Android學(xué)習(xí)之Broadcast的簡(jiǎn)單使用

    這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)之Broadcast的簡(jiǎn)單使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論

科技| 会东县| 本溪市| 汨罗市| 陵水| 兰考县| 寿宁县| 西林县| 株洲县| 丰镇市| 龙州县| 延津县| 屯留县| 会东县| 启东市| 富蕴县| 大冶市| 襄汾县| 左权县| 龙里县| 昌邑市| 凤庆县| 洮南市| 禹州市| 荔波县| 抚松县| 香港| 娄烦县| 临城县| 定襄县| 乌苏市| 岑巩县| 临城县| 广元市| 株洲市| 凌源市| 昭苏县| 涪陵区| 磐安县| 丹凤县| 广昌县|