1. 项目概述:Sencha Touch与Google Glass的跨界融合
2014年那个万物皆可HTML5的时代,当大多数开发者还在为移动端适配焦头烂额时,Sencha Touch团队已经将目光投向了可穿戴设备这片蓝海。Google Glass作为当时最具未来感的智能眼镜,其独特的交互方式和显示特性给传统开发模式带来了全新挑战。而Sencha Touch凭借其响应式布局和跨平台特性,意外成为了Glass应用开发的利器。
我曾在2015年参与过一个医疗AR项目,当时尝试用Sencha Touch为外科医生开发Glass端的患者信息展示界面。与传统移动端开发不同,Glass的"瞬现式"交互(用户瞥一眼就能获取关键信息)要求界面必须做到:信息密度极低但关键数据突出、响应延迟控制在300ms以内、完全语音和手势驱动。Sencha Touch的卡片式布局和轻量级组件恰好契合这些需求。
2. 核心需求解析
2.1 Google Glass的特殊约束
- 显示区域限制:640x360像素的微型显示屏,相当于传统手机屏幕的1/8面积
- 交互范式革命:完全依赖语音指令、头部姿态和触摸板滑动
- 性能红线:从唤醒到内容呈现必须控制在1秒内(实测超过1.2秒用户就会放弃)
- 信息层级扁平:单屏只展示1个核心数据点(如心率值)加2-3个辅助指标
2.2 Sencha Touch的适配优势
- 响应式布局系统:通过
fit和auto布局自动适应不同尺寸 - 硬件加速CSS3:动画性能比jQuery Mobile提升3-5倍
- 数据绑定机制:
Ext.data.Store可预加载关键数据 - 主题系统:通过Sass快速生成高对比度界面(Glass在阳光下需500:1的对比度)
关键技巧:使用
Ext.Viewport.setOrientation()强制锁定为横屏模式,避免Glass的陀螺仪干扰布局
3. 开发环境搭建
3.1 工具链配置
# 使用Sencha Cmd 4.0+(包含关键watch功能) npm install -g sencha-cmd@4.0.2.67 # 创建项目模板 sencha -sdk /path/to/touch-2.4.2 generate app GlassApp ./glass-app3.2 关键配置调整
在app.json中修改:
{ "viewport": { "autoMaximize": false, "width": 640, "height": 360 }, "requires": [ "touch-charts" // 必须引入图表组件 ] }3.3 模拟器方案选型
- 官方Mirror API模拟器(已弃用)
- 第三方XR模拟器:
- Glass Enterprise Edition 2模拟器(需申请开发者权限)
- 通过Chrome设备模拟设置自定义分辨率
// 在app.js中加入环境检测 if(navigator.userAgent.match(/Glass/)) { Ext.os.is.Glass = true; }
4. 核心开发模式
4.1 时间轴卡片布局
Glass的交互核心是纵向滚动的时间轴,Sencha Touch中可通过自定义Ext.dataview.DataView实现:
Ext.define('Glass.view.Timeline', { extend: 'Ext.dataview.DataView', config: { itemTpl: [ '<div class="card">', '<h1>{title}</h1>', '<p class="highlight">{value}</p>', '</div>' ], scrollable: { direction: 'vertical', directionLock: true } } });4.2 语音交互集成
通过Web Speech API桥接Glass的语音指令:
const recognition = new webkitSpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; recognition.onresult = (event) => { const transcript = event.results[0][0].transcript; if(transcript.includes('show vitals')) { Ext.Viewport.setActiveItem('vitalsView'); } };4.3 性能优化实战
图片处理:
- 使用SVG代替PNG(体积减少70%)
- 预加载所有资源到内存:
Ext.onReady(() => { Ext.create('Ext.Img', { src: 'resources/icons/heart.svg', hidden: true }); });数据更新策略:
- 采用WebSocket长连接(心跳间隔15秒)
- 差分更新DOM而非全量刷新
updateData: (newData) => { const el = Ext.getCmp('heartRate'); el.setHtml(newData.value); el.el.animate({duration: 200, keyframes: {opacity: [0.5, 1]}}); }
5. 典型问题排查指南
| 现象 | 根本原因 | 解决方案 |
|---|---|---|
| 触摸事件不触发 | Glass触摸板事件类型为pointerevents | 在app.js中加入Ext.supports.PointerEvents = true; |
| 界面闪烁 | GPU内存不足导致重绘 | 为所有卡片添加transform: translateZ(0)强制硬件加速 |
| 语音识别延迟 | WebKit语音引擎初始化慢 | 在启动画面预加载语音引擎 |
| 数据不同步 | Glass进入休眠时WebSocket断开 | 实现visibilitychange事件监听重连 |
6. 企业级开发经验
在医疗级应用开发中,我们总结出三条黄金法则:
- 信息密度控制:每张卡片不超过7个元素(符合米勒定律),关键数据字体不小于24px
- 颜色规范:
- 报警值:
#FF3B30(RGB 255,59,48) - 正常范围:
#4CD964(RGB 76,217,100) - 背景色:纯黑
#000000提高户外可视性
- 报警值:
- 交互反馈:
- 成功操作:短振动(100ms)
- 错误操作:长振动(400ms)配合红色边框闪烁
// 高对比度主题变量 $glass-alert-color: #FF3B30; $glass-base-color: #000000; $glass-font-size: 20px; @include sencha-button-ui('glass', $glass-base-color, 'matte');7. 调试与发布
7.1 真机调试技巧
- 启用Glass的ADB调试:
adb connect 192.168.1.100:5555 # Glass默认IP adb logcat | grep "Web Console"- 使用
weinre远程调试DOM:
npm install -g weinre weinre --boundHost 0.0.0.0 --httpPort 90907.2 打包优化
通过Sencha Cmd进行高级压缩:
sencha app build --environment=production --optimize=uglify关键参数:
--remove-text-references:将文字转为Unicode编码--strip-comments:删除所有注释--enable-brotli:启用Brotli压缩(需Glass系统支持)
8. 架构演进思考
随着Glass Enterprise Edition 2的发布,现代开发可考虑以下改进:
混合渲染方案:
- 核心框架仍用Sencha Touch
- 高频更新区域改用Canvas绘制(如心电图波形)
const ctx = Ext.get('ecg-canvas').dom.getContext('2d'); ctx.beginPath(); ctx.moveTo(0, data[0]); data.forEach((v,i) => ctx.lineTo(i*2, v)); ctx.strokeStyle = '#FF3B30'; ctx.stroke();WebAssembly加速:
- 将关键算法移植到Rust编译wasm
- 实测FFT运算速度提升8倍
持久化存储优化:
const store = Ext.create('Ext.data.Store', { proxy: { type: 'indexeddb', database: 'GlassDB', id: 'vitalCache' } });
在完成三个Glass项目后,最深刻的体会是:可穿戴设备的UI设计必须回归信息本质。每次当我在代码中忍不住想添加炫酷动画时,都会问自己——这个交互动作能否在用户单次眨眼(约300ms)内完成?如果不能,那就不是合格的Glass应用。这种极致克制的开发哲学,反而让代码质量达到了前所未有的高度。