压缩UI深度的代码实现

时间:2022-09-02 11:25:23

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

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

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

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

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

代码实现如下:

 var depthList:Vector.<int> = getDepthList(this);
//打印结果
for(var i:int = 0; i < depthList.length; i++)
{
trace("元件\"" + getChildAt(i).name + "\"的深度是: " + depthList[i]);
} /**
* 获取指定容器下的最小深度列表,按子对象z轴由下到上的顺序排列其深度数值.
*/
function getDepthList(target:DisplayObjectContainer):Vector.<int>
{
var result:Vector.<int> = new Vector.<int>(target.numChildren, true);
//结果数组使用 0 填充
var i:int;
for(i = 0; i < target.numChildren; i++)
{
result[i] = 0;
} for(i = 0; i < target.numChildren; i++)
{
var child:DisplayObject = target.getChildAt(i);
getChildDepth(target, child, i, result);
} return result;
} function getChildDepth(target:DisplayObjectContainer, child:DisplayObject, index:int, result:Vector.<int>):void
{
for(var i:int = 0; i < target.numChildren; i++)
{
var targetChild:DisplayObject = target.getChildAt(i);
//过滤掉自己
if(targetChild == child)
{
continue;
}
//只处理位于当前显示对象下方的显示对象
if(i < index)
{
//只处理相互存在重叠的显示对象
if(targetChild.hitTestObject(child))
{
//获取深度, 下方所有对象的深度必然都已经获得, 直接 + 1 即可
var depth:int = result[i] + 1;
//如果存在更大的深度就使用更大的深度
if(result[index] < depth)
{
result[index] = depth;
}
}
}
}
}

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

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

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

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

    iOS开发UI篇—从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他 ...

  2. 自写脚本实现上线前本地批量压缩混淆 js &comma; css 代码。

    最近做项目遇到一个要求,就是把本地的 js 和 css 进行压缩后再上线,由于之前项目并没有使用 webpack 之类的库,项目上也因为一些机密不能在线上压缩,这无疑给代码打包压缩带来了很大麻烦,于是 ...

  3. 如何免费使用GPU跑深度学习代码

    从事深度学习的研究者都知道,深度学习代码需要设计海量的数据,需要很大很大很大(重要的事情说三遍)的计算量,以至于CPU算不过来,需要通过GPU帮忙,但这必不意味着CPU的性能没GPU强,CPU是那种综 ...

  4. 英特尔&&num;174&semi; 实感™ 深度摄像头代码示例 – R200 摄像头数据流

    英特尔开发人员专区原文地址 简介 该可下载代码示例展示了如何使用面向 Windows 的英特尔® 实感™ SDK* 捕捉和查看用 C#/XAML 编写的原始 R200 摄像头数据流. Visual S ...

  5. &lbrack;实现&rsqb;Javascript代码的另一种压缩与加密方法——代码图片转换

    代码=图片 图片=代码 JS代码对于喜欢F12的同志来说,连个遮羞布都没有... 虽然把代码变成图片也仅仅只是增加一层纱布而已...但这方法还是挺好玩的,而且代码也被压缩了一点. 第一次看到[图片=代 ...

  6. 正确的 zip 压缩与解压代码

    网上流传的zip压缩与解压 的代码有非常大的问题 尽管使用了ant进行压缩与解压,可是任务的流程还是用的java.util.zip 的方式写的,我在使用的过程中遇到了压缩的文件夹结构有误,甚至出现不同 ...

  7. 压缩感知&OpenCurlyDoubleQuote;Hello World”代码初步学习

    压缩感知代码初学 实现:1-D信号压缩传感的实现 算法:正交匹配追踪法OMP(Orthogonal Matching Pursuit)   >几个初学问题   1. 原始信号f是什么?我采集的是 ...

  8. 拖图UI和纯代码UI

    1拖图UI, 优点:适合快速实验各种天马行空的想法 缺点:太多的storyBoard不好管理,不适合较大的项目,如果一个项目有价值,或成熟了,为了维护拓展,就最好改为纯代码 2纯代码UI 优点:1好维 ...

  9. gulp 压缩 js 和 css 代码

    我们在写出来的代码都是非常规范的,改换行的时候就换行,改tab 的时候就有tab,还有这样做是为了后期维护方便,但是这也导致了内存占用量的增大,当把把代码发到线上,如果网速慢一点,可能很久都加载不出来 ...

随机推荐

  1. jQuery 使用索引值容易出错的一个地方

    先看代码 $('input:eq(2)').attr('value', function(index, val){ console.log(index); //输出0 }); 问:当前元素的索引值,不 ...

  2. Linux 网络编程详解五(TCP&sol;IP协议粘包解决方案二)

    ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...

  3. POJ 2420 A Star not a Tree&quest; 爬山算法

    B - A Star not a Tree? Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/co ...

  4. canvas作图

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

    . 参考界面 : 携程app首页的广告栏, 使用ViewPager实现        自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...

  6. 笔记之monkey自定义脚本

    自定义脚本的稳定性测试 常规MOnkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景者时候就需要用到自定义脚本,Monkey支持执行用户自定义脚本的测试,用户之需要按照Monk ...

  7. 文件处理,三元操作符,seek&lpar;&rpar;函数,迭代函数和列表解析,reduce函数

    1.文件读取方类型 r,r+,w,x,a, r,读文件 w,写文件,文件内容全部删除,并将新内容从第一行开始赋值 x,写文件,只有文件不存在,可写,文件存在,报错 a,在文件莫问追加信息 r+,w+, ...

  8. JAVA中的配置文件XML

    一:概念 1.XML  Extensible markup Language 可拓展标记语言 2.功能:存储数据(配置文件,在网络中传输数据) 3.html和xml的区别 3.1xml标记全是自定义的 ...

  9. 6-2 S树 uva712

    这题关键是  反转    查询是固定按照x1x2x3来的   那么先收集前面的顺序  然后在数组里面直接调用即可 比如前面的树是 x3 x1 x2  就把这个当作数组下标 最左边的树是 1<&l ...

  10. Java多线程编程实战指南(核心篇)读书笔记(五)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...