当手机从锁屏界面解锁后 发现在运行的程序上画出的图形全部变成了白色;
原来图形上的贴图都没有了;
如果 退出程序 再重新打开的话 那么显示正常;我想锁屏幕的话 应该经过onSurfaceChanged 方法;所以 我怀疑是方法出问题了;
下面贴出 我的renderer 的主要代码
public abstract class AbstractRender implements Renderer{ AnimationCallback mCallback ;
int viewWidth ;
int viewHeight ;
int[] mViewport = null ;

float scale = 0.5f ;
public int[] textures ;
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glEnable(GL10.GL_TEXTURE_2D); //Enable Texture Mapping ( NEW )
gl.glShadeModel(GL10.GL_SMOOTH);  //Enable Smooth Shading
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);  //Black Background
gl.glClearDepthf(1.0f);  //Depth Buffer Setup
gl.glEnable(GL10.GL_DEPTH_TEST);  //Enables Depth Testing
gl.glDepthFunc(GL10.GL_LEQUAL);  //The Type Of Depth Testing To Do

//Really Nice Perspective Calculations
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
 //纹理相关        
//        IntBuffer textureBuffer = IntBuffer.allocate(6);  
//        gl.glGenTextures(6, textureBuffer);  
//        
//        textures = textureBuffer.array(); 
//        bindTexture(gl);
        
} @Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
viewWidth = width ;
viewHeight = height ;
mViewport = new int[]{0,0,width,height};
Log.d("onSurfaceChanged", "onSurfaceChanged,");
gl.glViewport(0, 0, width, height);
float ratio = (float)width/height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();  //Reset The Projection Matrix
gl.glFrustumf(-ratio, ratio, -1, 1, 2, 12);
((CubeActivity)mCallback).mGrabber.getCurrentProjection(gl);
gl.glMatrixMode(GL10.GL_MODELVIEW);  //Select The Modelview Matrix
gl.glLoadIdentity();  //Reset The Modelview Matrix
gl.glDisable(GL10.GL_DITHER);
        gl.glActiveTexture(GL10.GL_TEXTURE0);
}
float angleX = 30f ;

float angleY = -45f ;

@Override
public void onDrawFrame(GL10 gl) {
if(mCallback != null ){
//Log.d("onDrawFrame", "onDrawFrame");
mCallback.updateTime() ;
mCallback.worldRotate() ;
mCallback.layerRotate() ;
}
gl.glDisable(GL10.GL_DITHER);
// gl.glClearColor(0.5f,0.5f,0.5f,1);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
// 设置观察点位置
GLU.gluLookAt(gl, 0, 0, 1.0f, 0, 0, 0, 0, 1, 0);
gl.glTranslatef(0, 0, -3.0f);
gl.glScalef(scale, scale, scale);
// 旋转魔方,绕X轴旋转30度,然后绕Y轴旋转45度
gl.glRotatef(angleX, 1, 0, 0);
gl.glRotatef(angleY, 0, 1, 0);
gl.glColor4f(0.7f, 0.7f, 0.7f, 1.0f);
// gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
//
// gl.glEnable(GL10.GL_TEXTURE_2D); 
// gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY) ;
//
// gl.glEnable(GL10.GL_CULL_FACE);
// gl.glFrontFace(GL10.GL_CW);
//     gl.glShadeModel(GL10.GL_SMOOTH);
//     gl.glEnable(GL10.GL_DEPTH_TEST);
    ((CubeActivity)mCallback).mGrabber.getCurrentModelView(gl);
    // 绑定纹理
// gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
draw(gl);
// 禁用顶点、纹理坐标数组
// gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
// gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
// gl.glDisable(GL10.GL_DEPTH_TEST);
//        gl.glDisableClientState(GL10.GL_CULL_FACE);
//angle++ ;
}

protected abstract void draw(GL10 gl);

public interface AnimationCallback{
 void worldRotate();
 void layerRotate();
 void updateTime();
}

public void  setScale(float _scale){
scale = scale *_scale ;
if(scale > 0.85f){
scale = 0.85f ;
}else if(scale < 0.1f){
scale = 0.1f ;
}
//缩放后要重新将立体点转换成2维的平面坐标,因为立方体大小改变了
((CubeActivity)mCallback).isPoint2DProjected = false ;
}

说实话 对于有些方法的调用不是很清楚...
下面是 draw方法:public void draw(GL10 gl,int[] texture){
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// mIndexBuffer.position(0);
// mVertexBuffer.position(0);
// mColorBuffer.position(0);
// mTextureBuffer.position(0);
// gl.glEnable(GL10.GL_CULL_FACE);
gl.glFrontFace(GL10.GL_CCW);
// gl.glShadeModel(GL10.GL_FLAT);
gl.glCullFace(GL10.GL_BACK);
// gl.glEnable(GL10.GL_DEPTH_TEST); //不会画被挡住的图形部分
// gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
//gl.glColorPointer(4, GL10.GL_FIXED, 0, mColorBuffer);

//gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
for(int i = 0 ;i < 27 ;i++){
mWorldCubeList.get(i).draw(gl);
}
//  gl.glDisable(GL10.GL_DEPTH_TEST);
//      gl.glDisableClientState(GL10.GL_CULL_FACE);
      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
      gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//gl.glDrawElements(GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);
}mWorldCubeList.get(i).draw(gl);再一个draw方法 如下:public void draw(GL10 gl){

if(this.bInitTexture){
this.loadGLTexture(gl);
bInitTexture = false;
}


//gl.glColor4f(mFaceColor.red, mFaceColor.green, mFaceColor.blue, mFaceColor.alpha);

//if(!mFaceColor .equals(UtilHelper.BLACK) ){
 // Enable the texture state 
// gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
// Point to our buffers 
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId); 
    
FloatBuffer textureBuffer = getTextureBuffer();
textureBuffer.position(0);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
//}else{
//}

ShortBuffer indicesBuffer = getIndicesBuffer();
indicesBuffer.position(0);
        gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_SHORT, indicesBuffer);
       // if (!mFaceColor .equals(UtilHelper.BLACK)) { 
         //gl.glDisable(GL10.GL_TEXTURE_2D); 
    // gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
   
      // }
}实在不知道 屏幕从锁屏到解锁后 需要处理哪些,怎么 贴图都没了...望有人 能够解答!!

解决方案 »

  1.   

    我觉得你需要在AbstractRender类里面重写onResume()方法,用OpenGL对图片重新加载
      

  2.   

    详细看了下public void onSurfaceCreated(GL10 gl, EGLConfig config)
    这个方法,使用OpenGL ES的时候,一旦停止渲染线程,上下文就会丢失,程序里面所用的图片资源会被回收,所以你需要在public void onSurfaceCreated(GL10 gl, EGLConfig config)这个方法里对图片资源进行加载
      

  3.   

    详细看了下public void onSurfaceCreated(GL10 gl, EGLConfig config)
    这个方法,使用OpenGL ES的时候,一旦停止渲染线程,上下文就会丢失,程序里面所用的图片资源会被回收,所以你需要在public void onSurfaceCreated(GL10 gl, EGLConfig config)这个方法里对图片资源进行加载问题找到了,现在才回帖,原来锁屏再解锁后会触发onSurfaceCreated 方法,导致之前初始化的图片资源被回收,而我又没有重新生成那些图片,一直以为锁屏幕解锁只会触发 onSurfaceChanged方法,没想到理解错了 原来不止这一个方法,已经处理好了 谢谢!