NGUI 屏幕自适应大屏与小屏(初始设定宽高为1280x720,能适应比其小或者更大的屏)
具体细节可以参考另外一篇随笔!
以下提供的算法完成的事:
1.自适应1280x720分辨率以下的屏幕
2.自适应1280x720分辨率以上的屏幕
在我设定的要求内包括的分辨率大部分都测过了,背景图、全屏透明Sprite(主要用于九宫格区域的控件摆放)自适应都没问题(不会变形),其他的控件当然是由UIRoot组件搞定的!下面的算法主要就是说明背景、全屏透明Sprite的自适应!
之前的随笔已经说过实际屏幕比设定屏幕大的自适应,现在加入自适应比设定屏幕小的算法!
detail:
使用NGUI版本为3.6
设置:UIRoot中Manual Height=768(由于我们游戏UI定的大小是1280x768),Minimum=480(最小支持高为480的屏,更小的我没测过), Maximum=1536
脚本(将其挂在游戏对象下,每一个需要自适应的UI,都调用这个脚本里面的函数,传进去对应的参数,如AdaptiveUI函数、背景Sprite函数、全屏Sprite函数)
//注:此脚本所在UIRoot的状态必须是活动的
public class Adjust : MonoBehaviour
{
public UIRoot mRoot = null;
private static Adjust mInstance = null;
public static Adjust Instance { get { return mInstance; } }
/// <summary>
/// 自适应相关变量声明
/// </summary>
;//实际屏幕宽
;//实际屏幕高
;
;
private readonly float mWidthScale = Convert.ToSingle(Screen.width) / cDesignWidth;
private readonly float mHeightScale = Convert.ToSingle(Screen.height) / cDesignHeight;
private float mScreenSizeIsUnchanged = 0f;//屏幕大小不变
private readonly bool mIsMinScreen = (Screen.height < cDesignHeight && Screen.width < cDesignWidth);//是否小屏幕(比设定屏幕1280x768小)
void Awake()
{
if (mInstance == null)
{
mInstance = this;
}
CalculateScreenWidthHeight();
Output.Log(string.Format("Adjust.Awake(), mRealScreenWidth = {0}, mRealScreenHeight = {1}", mRealScreenWidth, mRealScreenHeight));
}
private void CalculateScreenWidthHeight()
{
if (mRoot != null)
{
float scale = 1.0f;
if (mRoot.activeHeight < Screen.height)
{
scale = (float)mRoot.activeHeight / Screen.height;
}
mRealScreenWidth = Mathf.CeilToInt(Screen.width * scale);
mRealScreenHeight = Mathf.CeilToInt(Screen.height * scale);
mScreenSizeIsUnchanged = Mathf.Abs(Convert.ToSingle(mRealScreenWidth) / mRealScreenHeight - Convert.ToSingle(cDesignWidth) / cDesignHeight);
return;
}
Output.Error("Adjust.CalculateScreenWidthHeight(), mRoot is null");
}
public void AdaptiveUI(UIRoot root)
{
//宽高比不变
if (mScreenSizeIsUnchanged < 0.0001f)
return;
//实际屏幕宽高比设定宽高小
if (mIsMinScreen)
return;
if (Convert.ToSingle(Screen.height) / Screen.width > Convert.ToSingle(cDesignHeight) / cDesignWidth)
root.manualHeight = Mathf.RoundToInt(Convert.ToSingle(cDesignWidth) / Screen.width * Screen.height);
else
root.manualHeight = cDesignHeight;
Output.Log(string.Format("Adjust.AdaptiveUI(), Screen.height={0} Screen.width={1}", Screen.height, Screen.width));
}
//自适应背景
public void AdaptiveBackground(UISprite backgroundSprite)
{
if (mScreenSizeIsUnchanged < 0.0001f)
return;
if (mIsMinScreen)
{
if (Convert.ToSingle(mRealScreenWidth) / mRealScreenHeight < (float)cDesignWidth / cDesignHeight)
{
//实际屏幕宽高比 比 设定的屏幕宽高比小,不需做适配
return;
}
else
{
float scale = cDesignWidth * mHeightScale / mRealScreenWidth;
int minScreenW = Convert.ToInt32(Convert.ToSingle(cDesignWidth) / scale);
int minScreenH = Convert.ToInt32(Convert.ToSingle(cDesignHeight) / scale);
backgroundSprite.SetDimensions(minScreenW, minScreenH);
return;
}
}
//实际宽高比设定宽高大 做适配
int maxScreenW = Mathf.RoundToInt(cDesignWidth * mHeightScale);
int maxScreenH = Mathf.RoundToInt(cDesignHeight * mHeightScale);
if (mHeightScale < mWidthScale)
{
maxScreenW = Mathf.RoundToInt(cDesignWidth * mWidthScale);
maxScreenH = Mathf.RoundToInt(cDesignHeight * mWidthScale);
}
Output.Log(string.Format("maxScreenW = {0}, maxScreenH = {1}", maxScreenW, maxScreenH));
backgroundSprite.SetDimensions(maxScreenW, maxScreenH);
}
//自适应全屏(透明)Sprite
public void AdaptiveFullScreenSprite(UISprite fullScreenSprite)
{
if (mScreenSizeIsUnchanged < 0.0001f)
return;
if (mIsMinScreen)
{
//小屏的height肯定小于设定height,因此只对width做适配
int w = Convert.ToInt32(Convert.ToSingle(cDesignWidth) / ((cDesignWidth * mHeightScale) / mRealScreenWidth));
int h = fullScreenSprite.height;
fullScreenSprite.SetDimensions(w, h);
return;
}
fullScreenSprite.SetDimensions(mRealScreenWidth, mRealScreenHeight);
}
}
如果帮到你了,给个赞顶一下吧!转载请注明出处,谢谢!
NGUI 屏幕自适应大屏与小屏(初始设定宽高为1280x720,能适应比其小或者更大的屏)的更多相关文章
- NGUI 屏幕自适应(初始设定宽高800x480只支持比其大的屏幕)
自适应讲解部分可以参考以下网址:http://www.xuanyusong.com/archives/2536,下面代码中提到的AdaptiveManualHeight()函数就是参考该文章的. 下面 ...
- NGUI 屏幕自适应
雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表 现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少 ...
- NGUI屏幕自适应(转)
屏幕自适应 NGUI可以比较方便的实现屏幕自适应,但是它的官方教程里面针对这个问题没有详细的教程,所以可能在实现的时候会走比较多的弯路.以下是我在开发过程中找到的一个比较方便的实现方法. 主要组件 ...
- NGUI屏幕自适应
NGUI确实是非常棒的一个做界面的插件,比起U3D自带的GUI要好很多,当然也有一些不好之处,毕竟什么都不可能那么完美. 最近在用Unity写游戏使用NGUI遇到了一个很多人都在遇到的问题,就是关于屏 ...
- 【Unity3D插件】NGUI屏幕自适应(转)
屏幕自适应 NGUI可以比较方便的实现屏幕自适应,但是它的官方教程里面针对这个问题没有详细的教程,所以可能在实现的时候会走比较多的弯路.以下是我在开发过程中找到的一个比较方便的实现方法. 主要组件 1 ...
- NGUI屏幕自适应解决方案
NGUI研究院之自适应屏幕 http://www.xuanyusong.com/archives/2536 Unity3D研究院之使用Android的硬件缩放技术优化执行效率 http://www.x ...
- [Unity3D]NGUI用Sprite动画和屏幕自适应做游戏开始场景
我们在玩任何一款手游产品时,都是先上来个logo界面,游戏欢迎界面等,这就意味着我们要做一款游戏需要多个场景,场景之间来回切换实现游戏逻辑,unity也不例外,所以从本篇开始将会介绍如何搭建多个场景, ...
- 在一个没有设置宽高的容器中,为什么设置position:absolute后就可以全屏显示了?
此场景适用于移动端百分比布局,背景全屏显示. 在一个没有设置宽高的容器中设置背景,想要背景全屏显示,设置bcakground-size:100%;后还需设置position:absolut; 原因: ...
- [Leetcode]下一个更大元素II
题目 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地 ...
随机推荐
- MySQL的数值类型,时间
数值类型 整数型 tinyint smallint mediumint int|integer bigint 注意: 1, 如何选择数据类型,我们的原则是:够用就行!尽量的选择占用内存小的整型 ...
- Mongodb故障转移
测试环境 四台测试服务器10.151.151.150:27017(主节点),10.151.151.151:27017(从节点),10.151.151.152:27018(从节点),10.151.151 ...
- FIS
学习官网 http://fis.baidu.com/docs/beginning/getting-started.html 1. fis release: 编译并发布 fis releas ...
- 用ionic快速开发hybird App(已附源码,在下面+总结见解)
1.ionic简介 ionic 是用于敏捷开发APP的解决方案.核心思路是:利用成熟的前端开发技术,来写UI和业务逻辑.也就是说,就是一个H5网站,这个区别于react-native,native.即 ...
- jQuery on 绑定的事件触发多次
jquery用on绑定事件,在代码执行过程中,可能会遇到多次执行的情况. 解决方案是在on的事件前面加上一个off,再on. $('#btnBind').off('click').on('click' ...
- ASP.NET MVC 中将FormCollection与实体间转换方法
将Action动作中传递的FormCollection转变成对应的实体,可以使用Controller的TryUpdateModel()方法. public ActionResult Create(Fo ...
- JAVA代码热部署,在线不停服动态更新
本地debug的时候,可以实时编译并更新代码,线上也可以不停服来动态更新类,即所说的java热部署. JDK代理的两种方式: 1.premain方式是Java SE5开始就提供的代理方式,但其必须 ...
- [Nginx] 在Linux下的启动、停止和重加载
Nginx的启动 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 其中-c参数指定配置文件路径. Nginx的停止 ...
- try it, then you know . Emacs
原来Emacs能做时间管理 http://sachachua.com/blog/2012/07/transcript-emacs-chat-john-wiegley/ http://blog.csd ...
- CListCtlr 控件的常见用法
今天第一次用CListCtrl控件,遇到不少问题,查了许多资料,现将用到的一些东西总结如下: 以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtr ...