Android OpenGlL GLSurfaceView基本實現方法


GLSurfaceView 是一個視圖,繼承至SurfaceView,它內嵌的surface專門負責OpenGL渲染。

在使用的時候要實現以下幾步。

一、創建自定義1類繼承自GLSurfaceView,並創建構造器

二、創建自定義2類實現GLSurfaceView.Renderer接口

  重寫onDrawFrame(GL10 gl)、 onSurfaceChanged(GL10 gl, int width, int height)、onSurfaceCreated(GL10 gl, EGLConfig config)方法

三、在自定義1中定義自定義類2,並在自定義類1的構造方法中調用setRenderer(renderer);方法進行渲染器設置

四、在主Ativity中創建自定義類1,並將其設置為視圖,為了使GLSurfaceView能夠與Activity同步,要重寫Activity的onPouse和onResume方法,並分別在相應的方法中調用GLSurfaceView的onPouse和onResume方法。

*********以下一簡單的GLSurfaceView應用,點擊屏幕,根據屏幕坐標設置屏幕顏色。*******

package com.example.android_opengl;

import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL; import javax.microedition.khronos.opengles.GL10;

import android.content.Context; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.util.Log; import android.view.MotionEvent;

public class MyGLSurfaceview extends GLSurfaceView{  MyGLRender myRender;  float vertexArray[]=new float[]{    -0.8f,-0.4f*1.732f,0.0f,    0.8f,-0.4f*1.732f,0.0f,    0.0f,0.4f*1.732f,0.0f };  ByteBuffer vbb=ByteBuffer.allocateDirect(vertexArray.length*4);  FloatBuffer fb;  public MyGLSurfaceview(Context context) {   super(context);   // TODO Auto-generated constructor stub   vbb.order(ByteOrder.nativeOrder());   fb=vbb.asFloatBuffer();   fb.put(vertexArray);   fb.position(0);      myRender=new MyGLRender();

  setRenderer(myRender);           }

 @Override  public boolean onTouchEvent(final MotionEvent event) {   // TODO Auto-generated method stub     queueEvent(new Runnable() {        @Override    public void run() {     // TODO Auto-generated method stub     myRender.setColor(event.getX() / getWidth(), event.getY() / getHeight(),1);         }   });   return super.onTouchEvent(event);  }    private class MyGLRender implements Renderer{

  @Override   public void onDrawFrame(GL10 gl) {    // TODO Auto-generated method stub    gl.glClearColor(mRed, mGreen,mBlue, 0.8f);//設置屏幕顏色      gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);// 清空緩存

      }

  @Override   public void onSurfaceChanged(GL10 gl, int width, int height) {    // TODO Auto-generated method stub    gl.glViewport(0, 0, width, height);//設置窗口   }

  @Override   public void onSurfaceCreated(GL10 gl, EGLConfig config) {    // TODO Auto-generated method stub       }   public void setColor(float r, float g, float b)         {           mRed = r%10; mGreen = g%10; mBlue = b%10;           System.out.println("R "+mRed+"   G"+mGreen+"    B"+mBlue);         }           private float mRed;           private float mGreen;           private float mBlue;                        } }

 

package com.example.opengl_huizhisanjiaoxing;

import android.os.Bundle; import android.provider.Settings.Global; import android.app.Activity; import android.view.Menu;

public class MainActivity extends Activity {

 MyGLSurfaceView GLview;  @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   GLview=new MyGLSurfaceView(this);   setContentView(GLview);  }

 @Override  protected void onPause() {   // TODO Auto-generated method stub   super.onPause();   GLview.onPause();  }  @Override  protected void onResume() {   // TODO Auto-generated method stub   super.onResume();   GLview.onResume();  }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM