適配模式app
(1)EXACT_FIT :拉伸變形,使鋪滿屏幕。會出現圖像拉伸函數
屏幕寬 與 設計寬比 做爲X方向的縮放因子,屏幕高 與 設計高比 做爲Y方向的縮放因子。佈局
保證了設計區域徹底鋪滿屏幕,可是可能會出現圖像拉伸。this
(2)NO_BORDER :按比例放縮,全屏展現不留黑邊。會有超出屏幕區域設計
屏幕寬、高分別和設計分辨率寬、高計算縮放因子,取較(大)者做爲寬、高的縮放因子。圖片
保證了設計區域總能一個方向上鋪滿屏幕,而另外一個方向通常會超出屏幕區域。get
ResolutionPolicy::NO_BORDER狀況下,設計分辨率並非可見區域(VisibleSize),咱們佈局精靈須要根據VisibleOrigin和VisibleSize來作判斷處理。源碼
(3)SHOW_ALL :按比例放縮,所有展現不裁剪。可能會有黑邊。it
屏幕寬、高分別和設計分辨率寬、高計算縮放因子,io
取較(小)者做爲寬、高的縮放因子。保證了設計區域所有顯示到屏幕上,但可能會有黑邊。
(4)FIXED_WIDTH :按比例放縮,寬度鋪滿屏幕。
保持傳入的設計分辨率高度不變,根據屏幕分辨率修正設計分辨率的寬度。
(5)FIXED_HEIGHT :按比例放縮,高度鋪滿屏幕。
保持傳入的設計分辨率寬度不變,根據屏幕分辨率修正設計分辨率的高度。
使用FIXED_WIDTH和FIXED_HEIGHT ,可能會有一個方向超出屏幕:
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::createWithRect("My Game", Rect(0, 0, 960, 500), 0.7f);
director->setOpenGLView(glview);
}
auto winSize = Size(480, 320);//設計分辨率
auto screenSize = glview->getFrameSize();//屏幕分辨率,
// turn on display FPS
director->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
director->setAnimationInterval(1.0 / 60);
register_all_packages();
float widthRate = screenSize.width / winSize.width;
float heightRate = screenSize.height / winSize.height;
if (widthRate < heightRate)
{
//說明設計分辨率寬度偏大
//這時候咱們讓高度適配,寬度裁剪掉。也就是圖片寬度會超出屏幕外
//設置設計分辨率的和適配模式,進去看setDesignResolutionSize和updateDesignResolutionSize這兩個個方法的源碼能夠知道:
//下面這句代碼走完以後,設計分辨率的高度被設置成480,可是寬度並非800,而是作了縮放,下面註釋詳細介紹
director->getOpenGLView()->setDesignResolutionSize(winSize.width, winSize.height, ResolutionPolicy::FIXED_HEIGHT);
}
else
{
//說明設計分辨率高度偏大
//這時候咱們讓寬度適配,高度裁剪掉。也就是圖片高度會超出屏幕外
director->getOpenGLView()->setDesignResolutionSize(winSize.width, winSize.height, ResolutionPolicy::FIXED_WIDTH);
}
/*
updateDesignResolutionSize函數部分源碼:
_scaleX = (float)_screenSize.width / _designResolutionSize.width;
_scaleY = (float)_screenSize.height / _designResolutionSize.height;
if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT)
{
_scaleX = _scaleY;
//爲了讓_screenSize.width / _designResolutionSize.width = _screenSize.height / _designResolutionSize.height,
//將_designResolutionSize.width從新賦值
_designResolutionSize.width = ceilf(_screenSize.width/_scaleY);
}
*/
auto scene = HelloWorld::createScene();
director->runWithScene(scene);
return true;
}
void GLView::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)
{
CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set resolutionPolicy");
if (width == 0.0f || height == 0.0f)
{
return;
}
_designResolutionSize.setSize(width, height); _resolutionPolicy = resolutionPolicy; updateDesignResolutionSize(); }