10.4 3D动画效果的实现
OpenGL 本身可以强大的实现动画的效果,在 Android 中实现动画,实际上只是将 OpenGL 动画需要使用的元素在 Android 中重新实现。
参考示例程序:Touch Rotate(Graphics=>OpenGL ES=>Textured Triangle)
源代码:src/com/example/android/apis/graphics/TriangleActivity.java
src/com/example/android/apis/graphics/TriangleRenderer.java
Touch Rotate 程序的运行结果如图所示:
TriangleActivity.java 的内容如下所示:
代码语言:javascript复制 public class TriangleActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new GLSurfaceView(this);
mGLView.setEGLConfigChooser(false);
mGLView.setRenderer(new TriangleRenderer(this));
setContentView(mGLView);
}
@Override
protected void onPause() { // 使其中的 View 停止
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume() { // 使其中 View 重新开始
super.onResume();
mGLView.onResume();
}
private GLSurfaceView mGLView;
}
程序的在 onPause()
和 onResume()
中调用 View 的对应函数。
TriangleRenderer.java
的主要函数的内容如下所示:
public TriangleRenderer(Context context) {
mContext = context;
mTriangle = new Triangle();
}
public void onDrawFrame(GL10 gl) {
gl.glDisable(GL10.GL_DITHER);
gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL10.GL_MODULATE);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 开始绘制
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
GL10.GL_REPEAT);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
GL10.GL_REPEAT);
// 获取系统时间
long time = SystemClock.uptimeMillis() % 4000L;
float angle = 0.090f * ((int) time);
gl.glRotatef(angle, 0, 0, 1.0f); // 实现旋转
mTriangle.draw(gl);
}
OpenGL 本身带回动画绘制的功能,这里使用的 glRotatef()
是进行旋转。mTriangle 是一个三角形,在onDrawFrame()
根据 OpenGL 的上下文进行动画的绘制。