Android用的是OpenGL图形函数库,它可以跨平台。
OpenGL的定义:OpenGL(Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
Android所用到的是它的一个子集OpenGL ES(OpenGL for Embedded Systems(嵌入式系统))就是OpenGL的嵌入式版本。
1.主activity

package com.jftt.opengl;import android.app.Activity;import android.os.Bundle;public class OpenGL extends Activity {private static final String TAG = OpenGL.class.getSimpleName();private VortexView vortexView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);vortexView = new VortexView(this);setContentView(vortexView);}@Overrideprotected void onPause() {super.onPause();vortexView.onPause();}@Overrideprotected void onResume() {super.onResume();vortexView.onResume();}}


2.继承GLSurfaceView类的自己的View

package com.jftt.opengl;import android.content.Context;import android.opengl.GLSurfaceView;import android.view.MotionEvent;public class VortexView extends GLSurfaceView {private static final String LOG_TAG = VortexView.class.getSimpleName();private VortexRenderer renderer;public VortexView(Context context) {super(context);renderer = new VortexRenderer();setRenderer(renderer);}@Overridepublic boolean onTouchEvent(final MotionEvent event) {queueEvent(new Runnable() {@Overridepublic void run() {renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);renderer.setAngle(event.getX() / 10);}});return super.onTouchEvent(event);}}


3.实现渲染器renderer类

package com.jftt.opengl;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;import java.nio.ShortBuffer;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.opengl.GLSurfaceView;public class VortexRenderer implements GLSurfaceView.Renderer {private static final String TAG = VortexRenderer.class.getSimpleName();private float red = 0f;private float green = 0f;private float blue = 0f;private ShortBuffer indexBuffer;private FloatBuffer vertexBuffer;private short[] indicesArray = { 0, 1, 2 };private int numberOfVertices = 3;private float angle;private void initTriangle() {ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);vbb.order(ByteOrder.nativeOrder());vertexBuffer = vbb.asFloatBuffer();ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);ibb.order(ByteOrder.nativeOrder());indexBuffer = ibb.asShortBuffer();float[] coords = { -0.5f, -0.5f, 0f, 0.5f, -0.5f, 0f, 0f, 0.5f, 0f };vertexBuffer.put(coords);indexBuffer.put(indicesArray);vertexBuffer.position(0);indexBuffer.position(0);}public void setColor(float red, float green, float blue) {this.red = red;this.green = green;this.blue = blue;}public void setAngle(float angle){this.angle = angle;}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);initTriangle();}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {gl.glViewport(0, 0, width, height);}@Overridepublic void onDrawFrame(GL10 gl) {gl.glClearColor(red, green, blue, 1.0f);gl.glClear(GL10.GL_COLOR_BUFFER_BIT);gl.glRotatef(angle, 0f, 1f, 0f);gl.glColor4f(0.5f, 0f, 0f, 0.5f);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);gl.glDrawElements(GL10.GL_TRIANGLES, numberOfVertices, GL10.GL_UNSIGNED_SHORT, indexBuffer);}}


4.封装的三角形的类

package com.jftt.opengl;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;import java.nio.ShortBuffer;import java.util.Random;public class Triangle {private short[] myIndecesArray = { 0, 1, 2 };private int numberOfVertices = 3;private float red = 0f;private float green = 0f;private float blue = 0f;// a raw buffer to hold indices allowing a reuse of points.private ShortBuffer indexBuffer;// a raw buffer to hold the verticesprivate FloatBuffer vertexBuffer;private Random random = new Random();public Triangle() {red = random.nextFloat();red = red - (float) Math.floor(red);green = random.nextFloat();green = green - (float) Math.floor(green);blue = random.nextFloat();blue = blue - (float) Math.floor(blue);ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);vbb.order(ByteOrder.nativeOrder());vertexBuffer = vbb.asFloatBuffer();ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);ibb.order(ByteOrder.nativeOrder());indexBuffer = ibb.asShortBuffer();float[] coords = { randomValue(red), randomValue(red),randomValue(red), randomValue(green), randomValue(green),randomValue(green), randomValue(blue), randomValue(blue),randomValue(blue) };for (int i = 0; i < numberOfVertices; i++) {for (int j = 0; j < 3; j++) {vertexBuffer.put(coords[i * 3 + j]);}}for (int i = 0; i < 3; i++) {indexBuffer.put(myIndecesArray[i]);}vertexBuffer.position(0);indexBuffer.position(0);}private float randomValue(float value) {int tmp = random.nextInt(2);if (tmp == 0) {tmp = -1;}return value * tmp;}public FloatBuffer getVertexBuffer() {return vertexBuffer;}public ShortBuffer getIndexBuffer() {return indexBuffer;}public int getNumberOfVertices() {return numberOfVertices;}public float getGreen() {return green;}public float getRed() {return red;}public float getBlue() {return blue;}}

更多相关文章

  1. 2011年Android(安卓)Camera学习笔记之一
  2. Android(安卓)N 指纹框架
  3. android OpenGL ES2.0编程初学
  4. Android中OpenMax的适配层
  5. Android获取屏幕大小
  6. Android(安卓)初识Retrofit
  7. OpenCV4Android开发
  8. Android实现圆角弹框功能
  9. Android(安卓)MVP Demo

随机推荐

  1. android uiautomator写一个崩溃的监听
  2. Application requires API version 9. De
  3. Android中运行的错误:java.lang.Unsatisf
  4. 如何解决:ERROR: the user data image is
  5. GreenDao在Android(安卓)Studio中的使用
  6. 打造IOS移动渗透测试平台
  7. Android(安卓)Application的作用
  8. Android数据手册01:Android颜色码制表
  9. Android开发资料收集(转)
  10. android崩溃日志保存sdcard打开并发送到e