用手机来控制 PPT 的实现

HomeDevelopment用手机来控制 PPT 的实现

通过手机来控制 PPT,一直是一个很赞的想法!对,没错,这里就要介绍这样的实现方法。你将不需要坐在电脑前面操作 PPT 了,使用手机来控制,随时随地地切换。

先看一张效果图: 手机控制 PPT

嘿嘿,只要在手机上就可以实现控制电脑中的 PPT 展示哦。上一页、下一页、步骤,都可以实现(需要有前端基础的噢~,不懂的可以绕过,知道能有这个东西就好)。

实现的思路和方案:

思路:投影仪访问 PPT 的展示页面,手机访问 PPT 的控制页面。手机控制 PPT 的动作,通过服务器同步到电脑上的 PPT,从而实现手机控制 PPT 的功能。

  • 网页版的 PPT 使用 reveal-js。
  • 通过 Socket 来实现动作的同步信息。
  • 页面基于 NodeJs 来完成。

实现的细节:

首先需要在 NodeJs 上把 2 个页面渲染出来,一个是control,另外一个是show。具体的实现方法就不讲了,在 Express 的框架上非常简单。

引入socket.io,例如在处理页面跳转和渲染的路由里面——也就是服务器端,require并定义端口号,设置为广播。

/**
 *  定义 socket 的端口号,处理广播
 */
var io = require('socket.io').listen(3001);
io.sockets.on('connection', function (socket) {
    socket.on('message', function(data) {
        socket.broadcast.emit('message', data);
    });
});

其次是,在页面引入并制作 PPT,详细教程请看 reveal-js 官网。为什么会试用 reveal, 很简单的一个原因,它提供的 API 足以并且胜任实现这个功能。

PPT 制作好了之后,分别把代码拷贝到controlshow,其实在没有接入 socket 的前提下,这 2 个页面都可以播放的。

制作「控制台页面」的负责监控和发送指令:

/**
 * ppt 更换的时候,获取当前的 PPT 参数,拼装成为数组发送到服务器。
 */
Reveal.addEventListener( 'slidechanged', function( event ) {
    var arr = [event.indexh, event.indexv];
    socket.send(arr);
});

/**
 * ppt 单页有步骤的时候,发送套接字
 */
Reveal.addEventListener( 'fragmentshown', function( event ) {
    var indexf = $(event.fragment).data('fragment-index') + 1;
    var arr = [Reveal.getIndices().h, Reveal.getIndices().v, indexf];
    socket.send(arr);
});

/**
 * ppt 单页有步骤的时候,回退发送套接字
 */
Reveal.addEventListener( 'fragmenthidden', function( event ) {
    var indexf = $(event.fragment).data('fragment-index');
    var arr = [Reveal.getIndices().h, Reveal.getIndices().v, indexf];
    socket.send(arr);
});

发送的指令到达服务器端,第一段代码就会监控到。再通过「广播」的形式发送给展示页面「show」。在「show」页面,需要处理接到的指令,并按照指令执行动作:

/**
 *  定义 socket,客户端用户接收数据,端口需要和服务器端的保持一致。
 */
var socket = io.connect('http://127.0.0.1:3001');
socket.on('connect', function () {
    socket.on('message', function(data) {
        next(data);
    });
});

/**
 *  处理幻灯片播放的进度函数,使用 Reveal 的 slide 接口。
 */
function next(data) {
    var t = data.split(',');
    if(t.length > 2) {
        Reveal.slide(t[0], t[1], t[2]);
    } else {
        Reveal.slide(t[0], t[1]);
    }
}

这个时候,已经能够实现在「控制页面」操作 PPT,而「展示页面」同步操作的功能了。但是手机上怎么办?再来一个「响应式布局」,把手机上的「控制台」放大,便于操作:

/**
 * 响应式设计,在手机上放大控制台
 */
@media only screen and (max-width:320px) {
    .reveal {
        height: 200px;
    }
    .reveal .controls {
        width: 100%;
        height: 200px;
        right: 0px;
        background: rgba(0, 0, 0, 0.5);
        bottom: 0px;
    }
    .reveal .controls div {
        border-width: 30px;
    }
    .reveal .controls div.navigate-left {
        border-right-width: 50px;
        top: 73px;
        left: 45px;
    }
    .reveal .controls div.navigate-right {
        border-left-width: 50px;
        top: 73px;
        left: 195px;
    }
    .reveal .controls div.navigate-down {
        border-top-width: 50px;
        top: 140px;
        left: 130px;
    }
    .reveal .controls div.navigate-up {
        border-bottom-width: 50px;
        left: 130px;
        top: -15px;
    }
}

嘿嘿,现在已经完成了。Reveal 提供了很多套主题,可以应不同的需求进行切换使用。今天把所有的逻辑都整理了一遍,代码托管在 GitHub,详见 用手机控制 PPT,有兴趣的同学欢迎 Fork 或者 Star。

如何安装?

  • 前提:node 环境,npm 装好。
  • git clone这里的代码用手机控制 PPT 到本地,打开之后执行 npm install
  • 依赖安装完之后,执行node app.js
  • 浏览器打开 2 个窗口,分别输入: http://localhost:3000/control.htmlhttp://localhost:3000/show.html
  • 在 congtrol 页面操作 PPT 的播放,或者手机上。

后续?恩。你可以把这个应用包装一下,做样式定义,使得写 PPT 可以很容易。其实我很喜欢的就是 slid.es 这样的在线 PPT ,效果很炫,用起来很爽。

  • 作者「」于 更新本文
  • 文章声明:自由转载-非商用-非衍生-保持署名 | BY-NC-SA
← Jekyll 菜单高亮 曾经→
  • 获取每日の能量源
  • ATP