1.updateDesignResolutionSize()函数
void GLView::updateDesignResolutionSize()
{
if (_screenSize.width > 0 && _screenSize.height > 0
&& _designResolutionSize.width > 0 && _designResolutionSize.height > 0)
{
_scaleX = (float)_screenSize.width / _designResolutionSize.width;
_scaleY = (float)_screenSize.height / _designResolutionSize.height;
if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
{
_scaleX = _scaleY = MAX(_scaleX, _scaleY);
}
else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL)
{
_scaleX = _scaleY = MIN(_scaleX, _scaleY);
}
else if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) {
_scaleX = _scaleY;
_designResolutionSize.width = ceilf(_screenSize.width/_scaleX);
}
else if ( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) {
_scaleY = _scaleX;
_designResolutionSize.height = ceilf(_screenSize.height/_scaleY);
}
// calculate the rect of viewport
float viewPortW = _designResolutionSize.width * _scaleX;
float viewPortH = _designResolutionSize.height * _scaleY;
_viewPortRect.setRect((_screenSize.width - viewPortW) / 2, (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH);
// reset director's member variables to fit visible rect
auto director = Director::getInstance();
director->_winSizeInPoints = getDesignResolutionSize();
director->createStatsLabel();
//对视口(OpenGL渲染窗口大小)重新定义
director->setGLDefaultValues();
}
}
2.屏幕适配的函数setDesignResolutionSize()
通过1中的代码可以看出:
//1.自适应:不管宽和高的缩放比例是否相同,只是缩放到铺满整个窗口(视口的大小)
// 优点:铺满整个屏幕窗口
// 缺点:图像拉伸明显
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::EXACT_FIT);
//2.无黑边:以宽高的缩放比例中,较大的为准进行缩放(视口的大小)
// 优点:铺满屏幕窗口
// 缺点:缩放比小的一边有可能会超出屏幕窗口(相当于投影仪的影像超出了影布的范围),导致图像在屏幕中显示不全。
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::NO_BORDER);
//3.完全显示:以宽高的缩放比例中,较小的为准进行缩放(视口的大小)
// 优点:图像在屏幕中显示完全
// 缺点:缩放比大的一边有可能会出现黑边
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::SHOW_ALL);
//4.以高的缩放比例为准,进行缩放(视口的大小)
// 优点:高方向的图像在屏幕中显示完全
// 缺点:宽方向的图像在屏幕中显示不完全(有可能超出屏幕)
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::FIXED_HEIGHT);
//5.以宽的缩放比例为准,进行缩放(视口的大小)
// 优点:宽方向的图像在屏幕中显示完全
// 缺点:高方向的图像在屏幕中显示不完全(有可能超出屏幕)
glview->setDesignResolutionSize(1280, 720, ResolutionPolicy::FIXED_WIDTH);
3.容易弄混的函数getWinSize(),getVisibleSize(),getVisibleOrigin(),getFrameSize()
getWinSize()函数就是_designResolutionSize的大小,只要_designResolutionSize的大小没有重置,getWinSize()的值就不会变。
getVisibleSize()函数:
Size GLView::getVisibleSize() const
{
if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
{
return Size(_screenSize.width/_scaleX, _screenSize.height/_scaleY);
}
else
{
return _designResolutionSize;
}
}
由上可以看出:只有NO_BORDER适配模式的时候,getVisibleSize()的大小会特殊,其他情况下,getVisibleSize()和getWinSize()可以理解为大小相同。
getVisibleOrigin()函数:
Vec2 GLView::getVisibleOrigin() const
{
if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
{
return Vec2((_designResolutionSize.width - _screenSize.width/_scaleX)/2,
(_designResolutionSize.height - _screenSize.height/_scaleY)/2);
}
else
{
return Vec2::ZERO;
}
}
同样,只有在NO_BORDER适配模式的时候,getVisibleOrigin()函数的大小有变化,其他情况大小都为Vec2::ZERO(也就是Vec2(0.0f, 0.0f))
getFrameSize()函数,获取到的是_sceneSize的大小,即真机中显示屏幕的大小。