问题列表
- 打开其他页面返回当前页面 GLSurfaceView会有短暂黑屏
- 按HOME键回到后台再切换回来 GLSurfaceView会有短暂黑屏
分析
以上问题 总结下就是回到后台后再切换到前台, GLSurfaceView会有短暂黑屏
提出问题
1.GLSurfaceView 回到后台做了什么
2.GLSurfaceView 回到前台做了什么
GLSurfaceView 回到后台以及前台,那么关注onWindowVisibilityChanged 就可以了,我们看下相关源码
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
mWindowVisibility = visibility == VISIBLE;
mRequestedVisible = mWindowVisibility && mViewVisibility;
updateWindow(false, false);
}
protected void updateWindow(boolean force, boolean redrawNeeded) {
if (!mHaveFrame) {
return;
}
ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null) {
mTranslator = viewRoot.mTranslator;
}
if (mTranslator != null) {
mSurface.setCompatibilityTranslator(mTranslator);
}
int myWidth = mRequestedWidth;
if (myWidth <= 0) myWidth = getWidth();
int myHeight = mRequestedHeight;
if (myHeight <= 0) myHeight = getHeight();
getLocationInWindow(mLocation);
final boolean creating = mWindow == null;
final boolean formatChanged = mFormat != mRequestedFormat;
final boolean sizeChanged = mWidth != myWidth || mHeight != myHeight;
final boolean visibleChanged = mVisible != mRequestedVisible;
if (force || creating || formatChanged || sizeChanged || visibleChanged
|| mLeft != mLocation[0] || mTop != mLocation[1]
|| mUpdateWindowNeeded || mReportDrawNeeded || redrawNeeded) {
if (DEBUG) Log.i(TAG, "Changes: creating=" + creating
+ " format=" + formatChanged + " size=" + sizeChanged
+ " visible=" + visibleChanged
+ " left=" + (mLeft != mLocation[0])
+ " top=" + (mTop != mLocation[1]));
try {
final boolean visible = mVisible = mRequestedVisible;

本文深入探讨了GLSurfaceView在切换应用前后台时出现短暂黑屏的问题,分析了其背后的工作机制,并提供了解决方案。通过重写onWindowVisibilityChanged方法,避免了资源回收导致的黑屏现象。
最低0.47元/天 解锁文章
1780

被折叠的 条评论
为什么被折叠?



