2.19 网页窗口类(Window)

当用户需要在三维地图上进行弹窗展示,就需要用到网页窗口类。

网页窗口类是为了解决开发者自身网页元素,如div标签,不能覆盖在三维场景之上的问题所采用的技术手段,使用了IE内核的和Chromium内核的微型浏览器窗口,来加载开发者的网页,该窗口能时刻保持覆盖三维场景,因此可以实现开发者想要的效果。

网页窗口显示的内容,是url所指向的网页,如下图,创建了一个StaticWindow类型的窗口,设置其width及height值为“100%”,表示该窗口大小与地球窗口大小位置一致,实现了悬浮透明效果(透明效果是在url所指向的网页的样式中设置的):

整体UI覆盖效果

网页窗口类分为静态窗口(StaticPopWindow动态窗口(DynamicPopWindow

静态窗口在创建时就固定了其显示的位置,不随着三维地图场景内容变化而变化,一般适用于充当前端UI界面或者固定屏幕位置的信息展示。

**注意:为了确保显示效果正确,有且仅支持创建一个静态弹窗对象!虽然多个静态弹窗也可使用,但如果它们之间存在覆盖关系时,则强烈不建议使用!**

动态窗口则由创建时的 position 属性确定其在三维场景中绑定的位置,当场景发生变化时,窗口也会发生移动。

注意:不推荐动态窗口静态窗口同时使用,会发生UI遮盖现象,影响使用感官。如果想在创建静态弹窗的同时,实现动态气泡的效果,请参考下文中的第四小节,通过静态弹窗实现动态跟随标签效果。

浏览器内核

动态窗口仅支持IE内核模式,静态窗口可支持IE内核与Chromium内核模式。

browserType 属性可以指定使用何种浏览器内核来加载你的网页,因此你需要确保你的网页的兼容性,能正常运行在你所设置的浏览器内核中。

这里需要注意的是,使用IE内核窗口的情况下,通过 ieAlpha 属性来控制,对其设置半透明效果,是对网页整体元素生效的,如图:

IE效果

对于这种效果不满意的开发者,可使用Chromium内核窗口,当使用这种方式时,ieAlpha 属性将失效,开发者只需通过css样式的透明属性来实现相应网页效果即可,无需关注窗口本身透明参数,如图:

Chromium效果

网页窗口类具有添加、删除、更新的过程,可参考2.8 对象基本操作2.9 空间分析绘制类(Analysis)

注意:url属性不可更新,如需新的url地址,请删除窗口后再重新创建具有新url的网页窗口。

父子窗口交互

用户通过该功能将网页弹出在三维地图指定位置,通常来说,还需要两者进行交互,才能实现完整的弹窗功能。

在这里,为了方便说明,我们将弹窗窗口称之为子窗口,三维场景所在窗口为父窗口

1.父窗口发送消息至子窗口

父窗口发送消息较为简单,通过如下代码:

window.update({
    //子窗口待触发的函数名
    trigger: "Test",
    //子窗口待触发的函数参数,如Test(1234)
    triggerParam: "1234"
});

在子窗口处理消息页面上,需指定响应的函数:

function Test(id) {
    console.log("你调用了Test: " + id);
}

父窗口发送消息至子窗口

你可以在Test函数中,通过id的区别,来实现不同的代码调用。

2.子窗口发送消息至父窗口

在创建子窗口时,需注意在建立父子窗口消息的绑定关系,如:

var window = new CooSDK.DynamicPopWindow({
    url: gPopHtmlUrl,
    position: new CooSDK.PositionObj(120.21874782, 30.2098158, 15),
    customCallback: {
         //123为子窗口待发送的消息id;getResult123为父窗口响应id为123的回调函数
         123: getResult123,
         //456为子窗口待发送的消息id;getResult456为父窗口响应id为456的回调函数
         456: getResult456
    }
});

父窗口的消息响应函数可以这么写,param为从子窗口传递过来的参数值:

 function getResult123(param){
     console.log("响应id为123,接受参数为:" + param);
 }

根据子窗口浏览器内核的不同,消息的触发方式也存在区别:

IE内核:

var id = "123";
var param = "something else";
window.external.PushData(id + "@" + param);

Chromium内核:

var id = 123;
var param = "something else";
window.PushData(id + "@" + param);

这里用‘@’符号进行响应id与参数的区分,如果没有传递参数,可以直接这么写:

var id = 123;

window.PushData(id);
//or
window.external.PushData(id);

子窗口发送消息至父窗口

只要父子窗口建立起上文的对应关系,就能进行交互。

3.子窗口内网页的调试

这一节至关重要,关系到子窗口内网页的调试,请仔细阅读。

目前仅支持Chromium内核的静态窗口调试。

首先,等待子窗口网页正常加载。

然后,打开Chrome浏览器,在地址栏输入http://localhost:18322,不出意外的话,会出现类似如下内容:

远程调试

点击相关网址,会跳转到调试工具窗口,如图所示:

远程调试窗口

此时,原本弹窗上的UI已被远程调试窗口截获,其不具备响应能力,我们只需在远程调试窗口左侧页面上操作,就能正常调试子窗口的网页了。

4.通过静态弹窗实现动态跟随标签效果

目前仅支持Chromium内核的静态窗口。

在某些应用场景下,用户需要为场景的某些标志物绑定特定的标签或者窗口,该标签或窗口可跟着绑定的物体进行跟随移动。这里就介绍下具体的代码实现流程。

首先,我们需要创建一个ConversionObj对象,设置如下参数:

idArray:参数对应存有需要绑定的标签的标识id的数组,该标识id为用户自定义。

posArray:参数对应需要绑定的标签的经纬度位置的数组。

bRealtime:参数设置为true,则地图会按照一定的频率将传入的经纬度位置转换为屏幕坐标位置;设置为false,则不会触发计算及回调事件。

bKeepTrigger:参数设置为false,则在地图视点变化时触发回调事件;如设置为true,则每一帧都触发回调事件,考虑到实际使用情况,建议设置为false,减少资源占用。

callback:参数绑定回调事件,该事件会接收到地图按照一定频率返回的信息。 第二个参数为传回的屏幕坐标信息,字符串格式为"id:屏幕坐标x,屏幕坐标y;",如:"xxx:102,53;zzz:43,88;......"。用户可解析此信息,来指定div标签的位置。

接着,设置好如上参数后,每当事件触发,用户需要根据返回的屏幕参数,自行组织逻辑,根据业务需要展示动态标签。

results matching ""

    No results matching ""