GLSurfaceView android 3D 繪圖

要了解如何在android中實作繪圖,要先知道兩個物件

一個是 GLSurfaceView
一個是 GLSurfaceView.Renderer

GLSurfaceView 實作繪圖的視窗,是繼承自SurfaceView的View。因為是繼承自SurfaceView所以一樣有底下這些常用的方法
setRenderer()
onPause()
onResume()
queueEvent()
surfaceChanged()
surfaceCreated()
surfaceDestroyed()
... 其它不多做贅述


GLSurfaceView.Renderer  繪圖物件的處理,所有繪圖的部分都在這裡處理,其下有三個方法
     onDrawFrame(GL10 gl) //畫圖函數放在這裡。
     onSurfaceChanged(GL10 gl, int width, int height)
     onSurfaceCreated(GL10 gl, EGLConfig config) //Render被創立之後,初始化的函數都放在這裡。函數會被執行一次。


主要的Activity,要先把一個GLSurfaceView建入contentView。在這裡就是Oglv。

public class OpenglTest extends Activity {

     private Oglv oglv;
     public void onCreate (Bundle savedInstanceState){
          super.onCreate(savedInstanceState);
          oglv = new Oglv(this);
          setContentView(oglv);
     }
}

建一個新的class,名為Oglv,繼承自GLFurfaceView

class Oglv extends GLSurfaceView {
     private OglvRender oglvRender;
     public Oglv(Context mc){
          super(mc);

          oglvRender = new OglvRender();
          setRenderer(oglvRender);
     }
    // 觸控面版時,手機螢幕隨坐標變色
     @Override
     public boolean onTouchEvent(final MotionEvent event){
          queueEvent(new Runnalbe(){
               public void run(){
                     oglvRender.setColor(event.getX()/getWidth(), event.getY()/getHeight(), 1.0f);
               }
          });
          return true;
      }
   
}

建一個class,名為oglvRender, 繼承自GLSurfaceView.Render 

public class oglvRender implements GLSurfaceView.Renderer {
 
    private float red = 0f;
    private float green = 0f;
    private float blue = 0f;
 
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        
    }
 
    @Override
    public void onSurfaceChanged(GL10 gl, int w, int h) {
        gl.glViewport(0, 0, w, h);
    }
 
    @Override
    public void onDrawFrame(GL10 gl) { 
        gl.glClearColor(red, green, blue, 1.0f); //寫入背景顏色
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }
    //設定背景顏色
     public void setColor(float r, float g, float b){
         red=r; 
         green=g;
         blue=b; 
     }}
 
結果如下:
 

 
 

留言

這個網誌中的熱門文章

python 找圖自動點擊

Python pyserial 抓取系統內的 COM PORT

VBA EXCEL 工作表變化 馬上執行 的作法 Worksheet_Change