先感嘆一下吧~~android的各種分辨率各種適配虐我千百遍,每次新項目我依舊待它如初戀····
每家公司都有自己項目工程適配的方案,這種東西就是沒有最好,只有最適合!!!
這次新項目專項針對android,目的性強,適配方案我覺得2套圖去兼容android各種分辨率;
我們先了解一下android手機上的屏幕密度:
Android主要有以下幾種屏:
QVGA和WQVGA屏density=120;
HVGA屏density=160;
WVGA屏density=240....更多 density值表示每英寸有多少個顯示點;
和分辨率不一樣,大部分做應用的就可以通過屏幕密度走,那么游戲中也可以類似走這種路線;
但是現在的出現了超高清屏幕,諸如小米,三星稍微比較高端一點新出的機型分辨率都非常之高達到FHD;
FHD級別就是我們所謂的屏幕像素達到了1920*1080P格式,也就是全高清屏幕的簡稱了,要適應這種屏幕得單獨適配;
廢話不多了就直接上解決方案吧:
思路1:背景適配,然后往背景里面add部分UI原件的方法。先解決背景適配;
思路2:根據屏幕尺寸,去適應“屏幕窗口UI原件”,不屬於任何原件直接Add到CClayer中的;
代碼如下:
先建立一個VisibleRect類去通過CCEGLView拿到屏幕尺寸,然后再取八個點作為靜態方法以后直接當做目標定位使用
#ifndef __VISIBLERECT_H__ #define __VISIBLERECT_H__ #include "cocos2d.h" USING_NS_CC; class VisibleRect { public: static CCRect getVisibleRect(); static CCPoint left(); static CCPoint right(); static CCPoint top(); static CCPoint bottom(); static CCPoint center(); static CCPoint leftTop(); static CCPoint rightTop(); static CCPoint leftBottom(); static CCPoint rightBottom(); private: static void lazyInit(); static CCRect s_visibleRect; }; #endif /* __VISIBLERECT_H__ */
VisibleRect.cpp
#include "VisibleRect.h" CCRect VisibleRect::s_visibleRect; void VisibleRect::lazyInit() { if (s_visibleRect.size.width == 0.0f && s_visibleRect.size.height == 0.0f) { CCEGLView* pEGLView = CCEGLView::sharedOpenGLView(); s_visibleRect.origin = pEGLView->getVisibleOrigin(); s_visibleRect.size = pEGLView->getVisibleSize(); } } CCRect VisibleRect::getVisibleRect() { lazyInit(); return CCRectMake(s_visibleRect.origin.x, s_visibleRect.origin.y, s_visibleRect.size.width, s_visibleRect.size.height); } CCPoint VisibleRect::left() { lazyInit(); return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height/2); } CCPoint VisibleRect::right() { lazyInit(); return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height/2); } CCPoint VisibleRect::top() { lazyInit(); return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height); } CCPoint VisibleRect::bottom() { lazyInit(); return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y); } CCPoint VisibleRect::center() { lazyInit(); return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height/2); } CCPoint VisibleRect::leftTop() { lazyInit(); return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height); } CCPoint VisibleRect::rightTop() { lazyInit(); return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height); } CCPoint VisibleRect::leftBottom() { lazyInit(); return s_visibleRect.origin; } CCPoint VisibleRect::rightBottom() { lazyInit(); return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y); }
有了這個工具類可以做很多事情了;
下面我們需要去適配背景,具體方法如下:
CCSprite* PublicShowUI::setTagScale(CCSprite* tagSprite) { float last_X,last_Y; float X2 = tagSprite->getContentSize().width; float Y2 = tagSprite->getContentSize().height; last_X = ( (float)VisibleRect::getVisibleRect().size.width/X2) ; last_Y = ( (float)VisibleRect::getVisibleRect().size.height/Y2); tagSprite->setScaleX(last_X); tagSprite->setScaleY(last_Y); return tagSprite; }
要適應各種大小分辨率,一套圖是不夠用的,根據自己項目的需要去制作2套圖,我推薦的是如下分辨率套圖:
800*480 一套
1136*640 二套
HD高清 第三套 1920 * 1080 目前手機上面比較高的,據說三星的超過2000,可以自己去設定!
有了這些圖,分別整理自己的資源文件夾然后去適配,代碼如下:
/****************** *獲取屏幕分辨率 *根據分辨率計算使用哪一套資源 ******************/ int PublicShowUI::getinch(void) { int lastinch = -1; CCSize winSizeInPixels = screenSize; if(winSizeInPixels.width>=800&&winSizeInPixels.width<=960) { lastinch = INCH_1;//ihpone3.5寸 } else if(winSizeInPixels.width>960&&winSizeInPixels.width<=1136) { lastinch = INCH_2;//ihpone4寸及大部分android4寸左右屏幕 } else if(winSizeInPixels.width>1136&&winSizeInPixels.width<=1920) { lastinch = INCH_MAX;//超高清屏幕 } else { lastinch = INCH_2; } return lastinch; } /****************** *根據自定義圖片路徑去取不同套圖的路徑 *imgres 格式:imgdir%d/imgname.png ******************/ CCString* PublicShowUI::getResImgPath(char* imgres) { sprintf(str, imgres ,getinch()); return CCString::create(str); }
獲取屏幕分辨率screenSize:
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView(); pDirector->setOpenGLView(pEGLView); CCSize screenSize = pEGLView->getFrameSize();
使用:
view_Room = new View_Room(this, PublicShowUI::getResImgPath(IMG_ROOM_BACKGROUND), 1, VisibleRect::center());
背景圖一定要居中顯示:
VisibleRect::center()
OK以上便是我適配的方案和思路;
下面我上2張IOS模擬器上的圖,我故意再背景圖的邊框加了綠線,來顯示區別顯示全屏,然后用了兩套圖去適配!
3.5寸IOS的分辨率如下:
4寸分辨率如下: