Android中GLSurfaceView在横竖屏切换时重新创建表面缓冲导致的问题

在做Android的OpenGL ES应用时,经常会遇到接入各种支付SDK等弹出UI导致当前横竖屏状态切换的问题,比如游戏是横屏landscape的,而支付SDK弹出的View是竖屏portrait的,这时如果不插手处理的话,系统会对GL的表面缓冲进行重新创建的处理,比如横屏的800×480会被重新创建为480×800,这样就会导致绘图错误,效果可以参考下面stackoverflow上贴出的图片。

解决这个问题的方法是:

首先,在manifest中加入 android:configChanges=”keyboardHidden|orientation|screensize” 这几个值都是可能导致GL表面重新创建的情况:软键盘是否显示,朝向变化,屏幕尺寸变化,然后再在Activity类中加入响应这些配置变化的处理方法,自行解决应用底层触发的变化:

public void onConfigurationChanged(Configuration newConfig) {       
    super.onConfigurationChanged(newConfig);

    glView.getLayoutParams().width = initialWidth;
    glView.getLayoutParams().height = initialHeight;
}

这个方法中做的就是将GLSurfaceView的布局属性中的宽高按照上一次,或者说是初始化时的大小重新设置,可以通过GLSurfaceView的Renderer的onSurfaceChanged方法中传入的值来具体确定,这样,再弹出与初始位置不一样朝向的view后也不会导致GL表面横竖变化重新创建了。

参考文章:

Android OpenGL: crazy aspect ratio after sleep – http://stackoverflow.com/questions/7185644/android-opengl-crazy-aspect-ratio-after-sleep

博主友情提示:

如在您的评论中需要提及如QQ号、微信号、电子邮件地址或其他隐私敏感信息,欢迎通过>>博主专用加密工具v2<<加密后发布,原文只有博主可以看到。