cocos屏幕大小修改适配流程理解 - pxqwxl/myLearnPoject GitHub Wiki
cocos屏幕适配中主要涉及3个分辨率 1.screenSize 即当前屏幕大小 可以使用setFrameSize修改 2.winSize 即经过设计分辨率和适配方案转化后的屏幕大小 3.DesignResolutionSize 即设计分辨率
设计分辨率为开发阶段规定的数值
当屏幕大小发生变化时
1.首先我们把screenSize设置为当前屏幕大小
2.设置适配方案以及设计分辨率 此时 cocos 利用设计分辨率和适配方案 对screensize进行修正
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;`
`CCLOG("size========_screenSize.width - viewPortW,%f,_screenSize.height - viewPortH %f viewPortW %f viewPortH %f", (_screenSize.width - viewPortW) / 2, (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH);`
`_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();`
`CCLOG("size========width,%f,height %f _screenSize.width %f _screenSize.height %f", director->_winSizeInPoints.width, director->_winSizeInPoints.height, _screenSize.width, _screenSize.height);`
`director->_isStatusLabelUpdated = true;`
`director->setGLDefaultValues();`
`}`
}
4.随后在director->setGLDefaultValues()方法中调用setProjection(_projection);设置视口并对winsize进行复制
5.调用后 将适配后的屏幕大小通过 createOrthographicOffCenter方法对opengl显示内容进行转化缩放等操作
注 当修改完屏幕大小后 当前屏幕的界面并不能重新适配 因为当前的屏幕各个元素的contentsize以及position已经设定过了没有进行转换