在GLSurfaceView中的onResume()之后重新加载opengl纹理,可以通过以下步骤来实现:
以下是一个简单的示例代码:
public class MyGLSurfaceView extends GLSurfaceView {
private MyGLRenderer mRenderer;
public MyGLSurfaceView(Context context) {
super(context);
setEGLContextClientVersion(2);
mRenderer = new MyGLRenderer();
setRenderer(mRenderer);
}
@Override
public void onResume() {
super.onResume();
mRenderer.onResume();
}
@Override
public void onPause() {
super.onPause();
mRenderer.onPause();
}
private class MyGLRenderer implements GLSurfaceView.Renderer {
private int mTexture;
public void onResume() {
// 重新初始化OpenGL ES环境和资源
GLES20.glGenTextures(1, new int[]{mTexture}, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
// 加载纹理
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.texture);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
}
public void onPause() {
// 释放资源
GLES20.glDeleteTextures(1, new int[]{mTexture}, 0);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
}
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
// 绘制纹理
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture);
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glEnableVertexAttribArray(mTextureCoordHandle);
GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, mVertexBuffer);
GLES20.glVertexAttribPointer(mTextureCoordHandle, 2, GLES20.GL_FLOAT, false, 0, mTextureCoordBuffer);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, mIndexBuffer);
GLES20.glDisableVertexAttribArray(mPositionHandle);
GLES20.glDisableVertexAttribArray(mTextureCoordHandle);
}
}
}
在上述示例代码中,我们在GLSurfaceView的onResume()方法中重新初始化OpenGL ES环境和资源,并在GLSurfaceView的onDrawFrame()方法中重新加载纹理。在GLSurfaceView的onSurfaceChanged()方法中,我们重新设置OpenGL ES视口和投影矩阵。
领取专属 10元无门槛券
手把手带您无忧上云