基于UDP的H5跨屏实现

本文介绍了一种展厅中的图片跨屏显示效果,通过局域网同步播放技术和UDP多播实现图片在不同屏幕间的无缝过渡。核心逻辑由JS处理,涉及div对象的创建与位置更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于UDP的H5跨屏实现

不知你们见过一种效果没,在展厅上我们看到一个图片从一个屏幕好像无缝穿越到了另一个屏幕,看起来好像很高大上的样子。今天我们就是来做这么一件事情的。

实现这个效果的还是建立在我之前的局域网同步播放之上的。有一台设备做为主机作为参照(这里选择拼接在一起的设备的最坐边的设备):
大家都进行相应的位移操作,起始x坐标是相对于主机的距离。如下图示,

这里写图片描述

A的坐标 为 X,Y;
B的坐标为 X+A.width,Y;
C的坐标为 X+A.width+B.width,Y;

假设A发起组播,大家都以相同的速度进行位移,当A中图片移出屏幕时B便出现。

为了使这个效果可以进一步的扩展,我们把这个操作放到webview中,换做一个div对象。核心的逻辑部分交给JS来处理(DIV对象的创建和DIV对象位置更新)。
主机设备以udp多播形式转发js传送过来的创建或者更新位置操作。局域网中的设备获取到组播数据包后 load 相应的js方法 并将传过来的参数传入即可。

今天重点讲解下js部分的逻辑处理。 Js这边也是提供了一个消息的发送和处理的操作。发送消息是H5对象的创建以及更新,其余window收到消息后进行创建或者更新。可参照以下代码。

发送消息:

 function vikSendMessage(str) {
    if (!isTopestWindow()) return;

    var topwin = getTopWindow();
    try {
        topwin.VisJsApi && topwin.VisJsApi.sendMessage && topwin.VisJsApi.sendMessage(str)
    } catch (b) {
        debugMessage("vikSendMessage...error:" + b.message)
        return 99
    }
    return 0
}

处理消息:

function vikReceivedMessage(data) {
    if (!isTopestWindow()) return;

    var topwin = getTopWindow();
    try {
        var params = data.split("#");
        if (typeof params[0] != 'string' || typeof params[1] != 'string')
            return;

        var items = {
            type: params[0],
            data: {
                act: params[1],
                data: data.substr(params[0].length + params[1].length + 2)
            }
        };

        window.postMessage(items, '*');
    } catch (b) {
        debugMessage("vikReceivedMessage...error:" + b.message)
        return 99
    }
    return 0
}

window.postMessage 是H5的一个新功能 。window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息。基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个客户端之间通信。让我们来看一下window.postMessage是如何工作的。除了IE6、IE7之外的所有浏览器都支持这个功能。

页面收到消息之后再将消息发出,获取到消息后再判断我们是进行对象的创建还是更新相应的位置

    OnMessageHandle.uniqueOn('dynamicdiv', function(data) {

        if (data.act == 'create')
            createDynamicDiv(data.data);
        else if (data.act== 'update') {
            var params = data.data.split('#');

            var divid = params[0];

            var $obj = $("#" + divid);
            if ($obj.length == 0) return;

            var w = parseInt(params[3]);
            var h = parseInt(params[4]);

            var left = w - locationX;
            var top = h - locationY;

            // postJsError("divid:", divid, "w: ", w, "h: ", h, "left: ", left, "top: ", top);

            if (((left + $obj.width()) < 0) && ((top + $obj.height()) < 0))
                return;

            $obj.animate({
                left: left,
                top: top
            });
        }
    });

具体实现代码android 端和web 页面的最近整理周末会分享出来。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值