压缩UI深度的代码实现

记录一下,或许同样使用深度的NGUI以后会用到。

目前的项目的UI是用Stage3D实现的,采用了类似NGUI填写深度来确定覆盖关系,但同时可以使用的深度是有一个固定范围的,导致的问题是如果UI过多深度可能就会不够用,对于这种情况可以写段代码进行深度的压缩,比如如果两个图片相互之间不会重叠则可以使用同一个深度。

相对于传统的显示列表,每个深度都唯一的情况不同,压缩后的深度可以有多个是相同的,但是相同深度的图片不能重叠,否则会出现随机覆盖的问题。

压缩深度的前提条件是所有UI的遮罩顺序都必须是提前设定好的。

基本的思路如下:从最底层的UI开始逐个处理到最上层的UI,如果发现有重叠的UI,且这个重叠的UI是在自己的下方,那么我的深度就是这个UI的深度+1,同时可能我下方会有多个UI都和我重叠,所以我的深度应该是下方所有和我重叠的UI的深度的最大值+1。

代码实现如下:

 1 var depthList:Vector.<int> = getDepthList(this);
 2 //打印结果
 3 for(var i:int = 0; i < depthList.length; i++)
 4 {
 5     trace("元件\"" + getChildAt(i).name + "\"的深度是: " + depthList[i]);
 6 }
 7
 8 /**
 9  * 获取指定容器下的最小深度列表,按子对象z轴由下到上的顺序排列其深度数值.
10  */
11 function getDepthList(target:DisplayObjectContainer):Vector.<int>
12 {
13     var result:Vector.<int> = new Vector.<int>(target.numChildren, true);
14     //结果数组使用 0 填充
15     var i:int;
16     for(i = 0; i < target.numChildren; i++)
17     {
18         result[i] = 0;
19     }
20
21     for(i = 0; i < target.numChildren; i++)
22     {
23         var child:DisplayObject = target.getChildAt(i);
24         getChildDepth(target, child, i, result);
25     }
26
27     return result;
28 }
29
30 function getChildDepth(target:DisplayObjectContainer, child:DisplayObject, index:int, result:Vector.<int>):void
31 {
32     for(var i:int = 0; i < target.numChildren; i++)
33     {
34         var targetChild:DisplayObject = target.getChildAt(i);
35         //过滤掉自己
36         if(targetChild == child)
37         {
38             continue;
39         }
40         //只处理位于当前显示对象下方的显示对象
41         if(i < index)
42         {
43             //只处理相互存在重叠的显示对象
44             if(targetChild.hitTestObject(child))
45             {
46                 //获取深度, 下方所有对象的深度必然都已经获得, 直接 + 1 即可
47                 var depth:int = result[i] + 1;
48                 //如果存在更大的深度就使用更大的深度
49                 if(result[index] < depth)
50                 {
51                     result[index] = depth;
52                 }
53             }
54         }
55     }
56 }

附上测试文件,可以拖拽UI来查看压缩后的深度。

http://pan.baidu.com/s/135JHG

时间: 2024-10-10 02:54:58

压缩UI深度的代码实现的相关文章

iOS开发UI篇—从代码的逐步优化看MVC

iOS开发UI篇—从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 // // YYappInfo.h // 12-视图改进(1) // // Created by apple on 14

正确的 zip 压缩与解压代码

网上流传的zip压缩与解压 的代码有很大的问题 虽然使用了ant进行压缩与解压,但是任务的流程还是用的java.util.zip 的方式写的,我在使用的过程中遇到了压缩的目录结构有误,甚至出现不同解压软件显示的目录结构不同的窘境. 下面给出使用org.apache.tools.ant.taskdefs.Zip;和org.apache.tools.ant.taskdefs.Expand 的压缩和解压过程. import java.io.File; import org.apache.tools.a

文顶顶 iOS开发UI篇—从代码的逐步优化看MVC

iOS开发UI篇—从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 1 // 2 // YYappInfo.h 3 // 12-视图改进(1) 4 // 5 // Created by a

iOS开发UI基础—从代码的逐步优化看MVC

iOS开发UI基础-从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他是否直接吃第五个,前面四个不用吃就饱了?) 1.完成基本要求的代码(使用了字典转模型和xib连线) (1)文件结构 (2)主要代码 字典转模型部分: YYappInfo.h头文件 1 // 2 // YYappInfo.h 3 // 12-视图改进(1) 4 // 5 // Created by

JAVA,使用ant-1.6.5,压缩、解压缩辅助类代码

有的时候,需要做文件的压缩.解压缩. java自身提供了已压缩,解压缩的原生类库.不过有开源代码的话,我一般是选择使用开源类库. 下面就贴一下,我使用ant-1.6.5的zip压缩.解压缩的代码吧. ZipUtil.java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStr

英特尔&#174; 实感? 深度摄像头代码示例 – R200 摄像头数据流

英特尔开发人员专区原文地址 简介 该可下载代码示例展示了如何使用面向 Windows 的英特尔® 实感™ SDK* 捕捉和查看用 C#/XAML 编写的原始 R200 摄像头数据流. Visual Studio* 解决方法实际上包含四个简单项目(均不到 200 行代码): ColorStream – 显示 RGB 摄像头的色彩数据流 DepthStream – 显示深度数据流 IRStreams – 显示左右 IR 摄像头数据流 AllStreams – 在单个窗口中显示上述所有数据流(图 1)

拖图UI和纯代码UI

1拖图UI, 优点:适合快速实验各种天马行空的想法 缺点:太多的storyBoard不好管理,不适合较大的项目,如果一个项目有价值,或成熟了,为了维护拓展,就最好改为纯代码 2纯代码UI 优点:1好维护  2一些UI控件可以较好的抽取,重复利用 缺点:1调试时,需要很多次的启动模拟器

使用gulp压缩并合并AngularJS代码

我们的移动web项目使用gulp作为自动化部署工具,由于移动设备4G流量费比较贵,一般我们做移动Web App项目正式发布时都需要把js代码进行压缩以便节省流量.包括使用的第三方js框架,正式发布时也应该使用压缩后的版本.对于自己写的js代码,因为现在是模块化开发,js文件比较多,需要先合并成一个文件后,去除log,进行压缩,基于gulp的管道式命令,实现这些还是很容易的.部分代码如下: var gulp = require('gulp'); var gutil = require('gulp-

UI部分(代码启动界面,frame,bounds,UIView)

1.在网上看到,团队合作项目时,会比较多时候用代码和xib联合起来设计ui. 如何在不用storyboard的情况下启动一个页面呢? 首先要在你的项目页面将启动页面的main interface设置为空! 接着在你的项目delegate文件里面设置代码,就是那个管理app生命周期的文件!(注意不是view生命周期的文件!) storyboard是自带有实例化了的windows . 而用代码启动时,必须要知道我们需要自己实例化一个窗口(window)来容纳我们需要展示的各种内容,还要设置在这个文件