Cocos2dx-Android屏幕适配方案

本文转载于http://www.cnblogs.com/zisou/p/cocos2d-xJIqiao3.html

先感叹一下吧~~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寸分辨率如下:

时间: 2024-10-10 08:49:50

Cocos2dx-Android屏幕适配方案的相关文章

开源,原创,实用Android 屏幕适配方案分享

说来惭愧,这段时间忙项目,有时间也拿来调侃人生,好久没有写过技术文章了) 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案.   已经用在一款成熟互联网 应用中,效果还不错 http://www.meilijie.com/ask/view/377116/http://www.meilijie.com/ask/view/377668/http://www.meilijie.com/ask/view/377838/http://www.meilijie.

原创,实用Android 屏幕适配方案分享

(说来惭愧,这段时间忙项目,有时间也拿来调侃人生,好久没有写过技术文章了) 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案. 已经用在一款成熟互联网 应用中,效果还不错. 说起android开发,UI界面的多机型适配,一向是个很重要的问题. 网上这方面的文章很多,面试的时候也经常会问到,大部分的内容都很类似,无外乎用dp,sp 不要用px之类老生常谈的问题. 但是会说的居多,实际可以执行的可行方案,很少有人会. 我在面试的时候,很多人连drawab

Android 屏幕适配方案(百分比)

博客源址:Android 屏幕适配方案 1.概述 大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比.如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率.包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率,那么有一个很奇怪的现象: 为什么Web页面设计人员从来没有说过,尼玛适配好麻烦? 那么,到底是什么原

android屏幕适配方案

曾经看了android的屏幕适配方案,有非常多种.当中自己用到的一种是:先找一款主流的分辨率的android机,如:1080*1920的分辨率做基准,然后在这个基准上.调整好一切布局.图片.适配其它手机分辨率的手机.用百分比来调节.比如:在480*800的主流手机上,写了一个height=520,那么在480*800的手机上,这个控件的高度则为 480height = 520 * 屏幕高度/1920. 这种方案做屏幕适配. 项目遇到一个问题. 在剩余空间里.在1080*1920的手机上适配非常好

Android 屏幕适配方案(转载)

3.百分比的引入 1.引入 其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹. 如下图: 然后我们根据一个基准,为基准的意思就是: 比如480*320的分辨率为基准 宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320 高度为480,将任何分辨率的高度分为480份,取值为y1-y480 例如对于800*480的宽度480: 可以看到x1 = 480 / 基准 = 480 / 320 = 1.5 ; 其他分辨率类似~~ 你可能会问,这么多文件,难道

Android 屏幕适配方案(包含生成程序dp sp与解决方案)

看之前希望先看: http://blog.csdn.net/zhaokaiqiang1992/article/details/45419023 此方案是看完上面的了博客总结出来的 方案1与方案2兼容~ 因为都是x? y? font?为名称 方案1: //values-xhdpi.. Dp的适配 与 values-xhdpi.. Sp的适配 这种适合 默认的那种 要是想非常精确 就考虑额外添加下面那个 的方案 按照以上计算方式,大致可以将市场上的手机划分为5个像素密度等级,具体如下: (1) ld

Android 屏幕适配方案

http://www.pento.cn/board/29243127 http://www.pento.cn/board/29243128 http://www.pento.cn/board/29243133 http://www.pento.cn/board/29243129 http://www.pento.cn/board/29243131 http://www.pento.cn/board/29243130 http://www.pento.cn/board/29243132 http:

Android开发屏幕适配方案

Android屏幕适配方案总结 日常开发中,难免遇到屏幕适配的方案,网上也有很多方案,在这里本人只是做一个总结,以免日后使用 单位的概念 pt(point):磅,一个标准的固定长度单位,大小为1/72英寸,主要用于印刷与平面设计.1英寸=2.54厘米=72磅 1pt=0.03527cm px(pixel):像素,组成屏幕图像的最小点,一个相对大小单位.同尺寸屏幕中像素越小越多,代表屏幕分辨率越高,反之越高. 1pt=(ppi/72)*px 屏幕尺寸(screen size):屏幕物理尺寸,指屏幕

【转】Android屏幕适配全攻略(最权威的官方适配指导)

Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持各种屏幕尺寸 使用wrap_contentmatch_parentweight 使用相对布局