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();  }

}

时间: 2024-11-23 22:51:55

Android OpenGlL GLSurfaceView基本实现方法的相关文章

Android模拟器设置网络代理方法

在服务器上启动模拟器的时候加了--http-proxy,但是不起作用.所以搜了下面的方法 四种方法: 一:将网络连接代理设置写入配置数据库 (适合启动模拟器无界面) 1.通过命令行或者通过双击emulatoer可执行文件,打开模拟器 2.在命令行执行adb shell 打开android的控制台 (确保环境变量设置正确,即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows)) 3.执行 ls -l /data/data/com.android.pr

Android异步任务的使用方法

Android上面的很多操作是不能直接放在ui线程上面的.当ui线程被阻塞5秒以上的时候应用会出现未响应的对话框过.当此现象出现的时候会直接影响用户的用户体验的.所以我们需要通过方法对异步任务或者操作进行相关的处理.在这里罗列出集中相关的处理方法: 首先我们最先想到的应该是使用Thread+Handler实现非UI线程更新UI界面,即在线程执行的时候通过发送message来通过Handler来处理和更新ui. 另外一种方法就是通过异步任务:AsyncTask来进行数据的处理,通过继承AsyncT

Android获取LayoutInflater对象的方法总结

在写Android程序时,有时候会编写自定义的View,使用Inflater对象来将布局文件解析成一个View.本文主要目的是总结获取LayoutInflater对象的方法. 1.若能获取context对象,可以有以下几种方法: LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View child = inflater.inflate(R.la

调试 Android* x86 应用程序的方法以及要使用的工具

作者:Xiaodong Wang 1.简介 众所周知,Android* 开发人员头顶许多称呼:设计员.程序猿等,并且通常会不可避免地被称为故障检修工.代码中的错误无法避免,因此无论您是否一开始就造成错误,了解调试工具以及如何迅速而有效地跟踪并解决错误都很重要.鉴于此,如今的 Android 开发人员必须掌握有效的调试技巧.本文提供了 Android 应用程序调试工具的简单教学,用于帮助 Android SDK 以及相关工具的新手迅速入门,并在 Android x86 平台上更有效地解决故障. 2

MyEclipse 10 中安装Android ADT 22插件的方法

MyEclipse 10 中安装Android ADT 22插件的方法 下载ADT包:http://dl.google.com/android/ADT-22.0.0.zip 将ADT-22.0.0.zip文件放在指定的目录下,例如D:\Programs\Android,不解压. 打开MyEclipse,点击菜单Help >MyEclipse Configuration Center,如下图 在MyEclipse Configuration Center中,点击Software标签,再点击add

Android peferenceActivity 自定义标题简单方法

Android peferenceActivity 自定义标题简单方法 peferenceActivity 完全使用定义好的布局. 因此不能简单象其它好窗口进行自定,现在我们需要加 一个自定义标题,比如象其它窗口一样加一个统一topbar. 假设这个topbar的布局是 title.xml 一.标准自定义标题栏方法 Android 提供自定义标题栏方法 我们简单实现. @Override protected void onCreate(Bundle savedInstanceState) { f

[Android]蓝牙相关接口及方法

首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permissionandroid:name="android.permission.BLUETOOTH" /> 然后,看下api,Android所有关于蓝牙开发的类都在android.bluetooth包下,共有8个类

【转】Android开启网络调试的方法

方法是偶然看到的:Android 终端adbd服务需要开启5555号端口来建立于adb的连接,如果未开启5555端口,则不能通过网络调试 查看是否可以网络调试: # netstat Android adb 不能通过网络调试的解决方法 有5555端口开放,说明可以进行连接:> adb connect 192.168.0.202 如果netstat显示没有5555端口开放,则需要设置adbd参数,并重新启动adbd服务:# stop adbd # setprop service.adb.tcp.po

Android两种旋转Bitmap方法比较

方法1. 利用Bitmap.createBitmap Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) { Matrix m = new Matrix(); m.setRotate(orientationDegree, ( float ) bm.getWidth() / 2, ( float ) bm.getHeight() / 2); try { Bitmap bm1 = Bitmap.createBitmap