主要代码:UIRoot,UIOrthoCamera,UIRect.GetSides(UIPanel使用UIRect的)里的GetSides,代码量很少,但需要思考和测试验证。

一、UIRoot的基本内容:
1.提供2种适配方式:pixel perfect和fixsize(新版本改成Flexible和Constrained,但一样的)
  前者是一个50x50的图标,无论在1280x720还是500x500的分辨率(屏幕尺寸)的屏幕上,都占屏幕中50x50的像素数目,所以在500x500的分辨率下会显得很大(因为它屏占比变大了许多);
  后者是无论在什么分辨率下,只要分辨率的比例是一样的,图标的屏占比不变。
  一开始我以为是后者做了额外的东西,深入了解后发现其实是前者做了额外的东西,后者啥都没干,现在先来看后者的效果是怎么出来的:
    fixsize保持UIRoot的scale恒定,且UICamera的orthographicSize=1恒定,并且每个dc对应的mesh的位置,顶点世界坐标等都不变,
屏幕尺寸变化时(比例不变),变的只有屏幕尺寸,所以它只是把相同的东西(mesh)渲染到不同的分辨率屏幕而已,就这样有了不变的屏占比。
    而如果分辨率比例变了,需要更新各个锚了UIPanel的物体的坐标,让他们新的水平边界,如果比例小于manulWidth/manulHeight,
则物体往中间“挤”,如果大于则往外面拉。
  而pixel perfect则根据屏幕尺寸不断变化UIRoot的scale,触发了2件事情,一个是各个锚点的更新(主要是需要更新锚UIPanel的物体),
一个是dc的重绘,所以各个mesh的位置,坐标等都发生了改变,为的就是维护图标的占的像素数目不变

2.无论是哪种方案,锚在UIPanel的物体可以认为是锚在uicamera的视口矩形上,这个矩形是height=2(即中心到上下边界都是1)的矩形,width根据视口比例得到,
所以当比例变的时候需要更新锚点,得到的mesh也会变。
(注:height能保持2这么小且固定是因为uiroot上加了缩放,把mesh都缩到这个固定矩形里了,具体我后面会谈到)

3.所以NGUI的适配做了2件事情:
  1).当分辨率比例变换时,更新锚点,让那些锚在视口的物体更新位置,移动物体的位置保证物体锚在视口的正确位置。
  2).当分辨率比例不变,只是尺寸变了,根据不同的适配方式对UIRoot设置不同scale,并且当scale变时更新锚点(因为最上层scale变时,下层的position变了,需要更新锚点)。
  UIRoot的处理是,先2后1,即先设置scale,缩放物体,然后更新锚点,让缩放后的物体锚到height=2的矩形里,所以无论scale是多少,
只要物体是锚在UIPanel上,那物体都在视口内。

4.但做适配的一般思路应该是,设置UICamera的orthographicsize,来确定相机的视口矩形(视口矩阵就是height=2*orthographicsize的矩形)
以在更新锚点后,物体的位置和大小能正确显示在视口内,估计NGUI原来也是这样做的,可以参考UIOrthoCamera脚本,我把orthographicsize
设死为720/2后,并且把UIRoot去掉,效果和fixsize一模一样,而设为screenheight/2,并加上发送UpdateAnchors事件后,效果和pixel perfect一样。
这种思路是拿相机去套物体,细节是设好相机视口,然后把物体锚到视口矩形里。
  fixsize模式:
    分辨率相同比例但不同尺寸下:视口矩形保持不变,所以只是把相同的东西显示到不同尺寸的屏幕而已。
    分辨率比例不同:视口矩形变了,更新锚点,物体的位置变化,一般保持视口矩形的height,根据视口比例算出width
  pixel perfect模式:
    视口矩形直接用屏幕分辨率矩形,所以视口矩形随屏幕尺寸变而变,更新锚点,物体都“挤”在视口矩形中,所以图标占的像素数目是不变的。
5.但NGUI的新版本使用另外的思路:保持视口矩形的height=2,缩小物体,然后更新锚点,把物体塞到这么小的视口矩形中,缩小物体是通过UIRoot.localScale做的。

透过UIRoot深入理解NGUI提供的屏幕适配方案的更多相关文章

  1. Unity2D多分辨率屏幕适配方案(转载)

    一下内容转自:http://imgtec.eetrend.com/forum/3992 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有 ...

  2. [原创]一种Unity2D多分辨率屏幕适配方案

    此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有使用第三方2D插件,如Uni2D,2D toolkit等开发的游戏,NGUI插件不受这个 ...

  3. Android 屏幕适配方案

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089: 本文出自:[张鸿洋的博客] 1.概述 大家在Android开发 ...

  4. 实用Android 屏幕适配方案分享

    转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android ...

  5. 一种Unity2D多分辨率屏幕适配方案

    http://www.cnblogs.com/flyFreeZn/p/4073655.html 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏 ...

  6. JavaScript强化教程 —— Cocos2d-JS的屏幕适配方案

    1. 设置屏幕适配策略(Resolution Policy) 如果你还没有用过Resolution Policy,只需要在游戏载入过程完成之后(cc.game.onStart函数回调中),调用下面的代 ...

  7. Cocos2d-JS的屏幕适配方案

    Cocos2d引擎为游戏开发者提供了屏幕适配策略(Resolution Policy)解决方案. 使用方式 1. 设置屏幕适配策略(Resolution Policy) 如果你还没有用过Resolut ...

  8. 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手

    Calces系列相关文章:Calces自动实现Android组件化模块构建 前言 屏幕适配一直是移动端开发热议的问题,但是适配方案往往在实际开发的时候会和UI提供的设计稿冲突.本文主要是基于官方推荐的 ...

  9. Web 端屏幕适配方案

    基础知识 像素相关 1.像素 :像素是屏幕显示最小的单位. 2.设备像素 :设备像素又称物理像素(physical pixel),设备能控制显示的最小单位,我们可以把这些像素看作成显示器上一个个的点. ...

随机推荐

  1. SparkBench安装使用入门

    SparkBench安装以及快速开始 欢迎关注我的GitHub~ 本指南假定已经可以正常使用Spark 2.x,并且可以访问安装它的系统. 系统环境 CentOS 7.7.1908 Ambari-Sp ...

  2. ASP.NET中使用Cache类来缓存页面的信息

    实现 如果将数据保存在全局应用程序对象Application中,值将会在程序运行时一直存在,而我们只需要缓存一段时间. ASP.NET提供了一个Cache对象来执行对象数据的缓存. Cache对象是S ...

  3. 借助GPU Boost和K80 Autoboost提高性能

    原网站:https://devblogs.nvidia.com/increase-performance-gpu-boost-k80-autoboost/ 由于我主要使用nvidia-smi,故nvc ...

  4. spring data jap的使用 1

    最近一直在研究Spring Boot,今天为大家介绍下Spring Data JPA在Spring Boot中的应用,如有错误,欢迎大家指正. 先解释下什么是JPA JPA就是一个基于O/R映射的标准 ...

  5. java_数据类型转换、运算符

    数据类型转换 Java程序中要求参与计算的数据,必须要保证数据类型一致,如果数据类型不一致将发生类型的转换. 1.1 自动转换 一个 int 类型变量和一个 byte 类型变量进行加法运算,运算结果, ...

  6. Java自学-图形界面 事件监听

    Swing 如何进行事件监听 示例 1 : 按钮监听 创建一个匿名类实现ActionListener接口,当按钮被点击时,actionPerformed方法就会被调用 package gui; imp ...

  7. 2020-07-29:从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?

    福哥答案2020-07-29: key 太长会导致一个页当中能够存放的 key 的数目变少,间接导致索引树的页数目变多,索引层次增加,从而影响整体查询变更的效率. 索引字段大小限制关于innodb_l ...

  8. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

  9. 【NOI2004】郁闷的出纳员 - Splay

    题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...

  10. LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式

    作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...