MIMS 屏幕分割方案(基于 dijit.layout.SplitContainer)

2023-11-08 15:58

本文主要是介绍MIMS 屏幕分割方案(基于 dijit.layout.SplitContainer),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提供用户自定义屏幕分割模板的功能。

提供为节目多屏播出,为每个屏幕设置屏幕模板功能。

屏幕分割模板管理的主体UI如下图所示:

 

 

 

 

操作说明:

 

· 点击屏幕左侧矩形方框选中一个区域 被选中颜色为Yellow

· 被选中区域处显示宽或高数值、水平或垂直方向。修改选中区域的的宽或高并更新修改

· 执行提交 系统把上图左侧显示区域的内容组织成JSON格式并通过DWR提交到系统中

支持任意的分割

 

源码片段:

 

        <script type="text/javascript">
            dojo.require("dijit.layout.SplitContainer");
            dojo.require("dijit.layout.ContentPane");
            dojo.require("dojo.parser"); // scan page for widgets and instantiate them
            dojo.require("dijit.form.Button");
            dojo.require("dijit.TitlePane");
            dojo.require("dijit.form.TextBox");
            dojo.require("dijit.form.Button");
           
            //var CURRENTPANE;
            var templateString = "<span SCType='cell'><a href=# οnclick=javascript:SplitComponent.divide('CURRENTPANE','horizontal');>水平</a> | <a href=# οnclick=SplitComponent.divide('CURRENTPANE','vertical');>垂直</a></span>";
           
            /**
             * 【注意】SplitComponent 依据dojo1.0版本构建,需重点阅读dojo1.0dijit.layout.SplitContainer对象方能读懂SplitComponent
             */
            if (!SplitComponent)
                var SplitComponent = {};
            // 最外层的容器的Id
            SplitComponent.id = "container";
           
            // pane 被选中的颜色
            SplitComponent.selectedColor = "yellow";
   // 被选中的pane
            SplitComponent.selectedNode;
            // pane初始颜色
            SplitComponent.initColor = "#FFF";
   // 鼠标移动颜色
   SplitComponent.slideColor ="#F8FEF2";//备选颜色:F6F7FA,D9E2EA,EDF0F3,EDF0FA
            // 屏幕显示最大宽度和高度
            SplitComponent.maxWidth = 512;
            SplitComponent.maxHeight = 384;
            // 像素的倍数,2表示屏幕显示比例50%1像素表示2像素
            SplitComponent.multiple = 2;
            // sizer宽度,像素值
            SplitComponent.sizerWidth = 6;
            // 日志
            if (!SplitComponent.LOGGER)
                SplitComponent.LOGGER = {};
            // 日志Debug级别
            SplitComponent.LOGGER.DEBUG = false;
   // container 内左上侧距离屏幕左上的距离,LEFT表示距离左侧的距离,TOP表示距离屏幕上侧的距离
            SplitComponent.LEFT, SplitComponent.TOP;
           
           
            if (!SplitComponent.Util)
                SplitComponent.Util = {};
            SplitComponent.Util.isIE = function(){
                return (window.navigator.appName == "Microsoft Internet Explorer");
            }
           
            SplitComponent.Util.isNetscape = function(){
                return (window.navigator.appName == "Netscape");
            }
           
            /**
             * ContentPane的相对于Container的内左上的坐标的实际(actual)值 以及ContentPane的宽高实际(actual)值; pane position size<br><br>
             * [<b>注意</b>]
             * <ul>
             * <li>内左上指Container显示区域的左上,不包括Container的边框</li>
             * <li>T.coords(DomNode,includeScroll)返回{l,t,width,height,x,y},其中的xy指的DomNode的外左上距离屏幕的左上的xy坐标值。</li>
             * </ul>
             * @param {Object} l left
             * @param {Object} t top
             * @param {Object} w width
             * @param {Object} h height
             */
            SplitComponent.PPS = function(l, t, w, h){
                this.left = l;
                this.top = t;
                this.width = w;
                this.height = h;
            };
           
            /**
             * [<b>功能</b>]<br>
             * 取出SplitContainer中的所有ContentPane的 坐标位置和尺寸的实际值
             * <br>
             * [<b>Example</b>]<br>
             var container = dijit.byId("container");<br>
             var ppsa = SplitComponent.getPPSA(container);<br>
             * @param {Object} splitC dijit.layout.SplitContainer
             */
            SplitComponent.getPPSA = function(splitC){
                function createPPSA(splitC){
                    if (typeof splitC == "string") {
                        splitC = dijit.byId(splitC);
                    }
                    if (!splitC.getChildren() || !splitC.getChildren().length) {
                        return;
                    }
                   
                    var childs = splitC.getChildren();
                    for (var i = 0; i < childs.length; i++) {
                        if (childs[i].orientation) {// splitC.getChildren() SplitContainer;
                            // 递归调用;
                            createPPSA(childs[i]);
                        }
                        else {
                            // a ContentPane;
                            PPS_A.push(SplitComponent.getPanePosAndSize(childs[i], splitC));
                        }
                    }
                   
                }
               
                var PPS_A = [];
                createPPSA(splitC);
               
                return PPS_A;
            };
           
            /**
             * [<b>功能</b>]获得某一个dijit.layout.ContentPane 真实的坐标位置和尺寸,相对于根容器container的内侧左上
             * @param {Widget} child Widget
             * @param {Widget} parWidget Parent Widget
             * @return {Object PPS} pane pos and size.
             */
            SplitComponent.getPanePosAndSize = function(/* widget */pane,/* Parent Widget ?*/ parWidget){
           
                var oDomNode = pane.domNode;
    
                //var originPos = dojo.coords(oDomNode, true);
                var originPos = T.coords(oDomNode, true);
                // DEBUG
                if (SplitComponent.LOGGER.DEBUG) {
                    alert("originPos.x[" + originPos.x + "]:originPos.y[" + originPos.y + "]");
                }
               
               
                if (!parWidget) {
                    parWidget = dijit.byNode(oDomNode.parentNode);
                }
                var styleNode = oDomNode.style;
               
               
                var t, l;
                t = parseInt(originPos.y) - parseInt(SplitComponent.TOP);
                l = parseInt(originPos.x) - parseInt(SplitComponent.LEFT);
               
                if (parWidget.isHorizontal) {
                    // horizontal;
                    return new SplitComponent.PPS(l, t, parseInt(styleNode.width), parseInt(styleNode.height));
                }
                else {
                    // vertical;
                    return new SplitComponent.PPS(l, t, parseInt(styleNode.width), parseInt(styleNode.height));
                }
            };
           
            /**
             * 从根容器containerinnerHTML中删除所有的panespana元素
             *
             */
            SplitComponent.clearAllPaneInnerHTML = function(){
                var container = dijit.byId("container");
                // TODO 取出container中的内容;
                var containerInnerHTML = container.domNode.innerHTML;
               
                if (SplitComponent.LOGGER.DEBUG) {
                    alert("初始字符串:/r/n" + containerInnerHTML);
                }
                // wrap所有的Span内容(ContentPane的内容)
                var spanNode = dojo.byId("wrap").getElementsByTagName("span");
               
                for (var i = 0; i < spanNode.length; i++) {
                    var start = containerInnerHTML.search(/<span/i);// 第一个<span> index
                    var end = containerInnerHTML.search(/<//span>/i);// 第一个</span> index
                    var src = containerInnerHTML.substring(start, (end + "</span>".length));// <span> </span>之间(<span></span>)的字符串
                    containerInnerHTML = containerInnerHTML.replace(src, "").replace(/yellow/gi, SplitComponent.initColor);
                }
                if (SplitComponent.LOGGER.DEBUG) {
                    alert("结果:/r/n" + containerInnerHTML + "/r/n字符总数:" + containerInnerHTML.length);
                }
                return containerInnerHTML;
            }
           
            /**
             * pane分割.该方法用sizerpane分割为水平或垂直的两部分<br><br>
             * [<b>注意</b>]<br>
             * 设置 dijit.layout.ContentPane.SCType = "ContentPane"
             * ContentPaneid替换"CURRENTPANE"
             *
             * @param {Object} paneNode 待分割的区域

这篇关于MIMS 屏幕分割方案(基于 dijit.layout.SplitContainer)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/370933

相关文章

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera