可 Web 编程的NativeUI 设计与实现

Similar documents
關於本書 l 3 PhoneGap Appcelerator Titanium Sencha Touch (wrapper framework) Native App PhoneGap Build Native App Hybrid App Java Objective-C Android SDK

05 01 accordion UI containers 03 Accordion accordion UI accordion 54

Microsoft Word - 01.DOC

本 课 程 作 为 非 计 算 机 专 业 本 科 通 识 课 程, 是 一 门 理 论 和 实 践 紧 密 结 合 的 实 用 课 程, 内 容 包 括 计 算 机 基 础 部 分 和 程 序 设 计 部 分 计 算 机 基 础 部 分 涵 盖 计 算 机 软 硬 件 组 成 数 制 表 示 操

付宝容器 jsapi 档 册 PDF 版本 本版本为实验版本, 为线下独 查看使, 受制于 成 PDF 程序的限制, 样式问题还没有很好的解决, 例如分 切图 代码 亮 推荐使 在线版本, 便实时查看 jsapi 运 效果 如需搜索, 使 阅读 PDF 软件 带功能即可 更多细节样式调整和 录索引探

RUN_PC連載_8_.doc

untitled

財金資訊-83期.indd

epub 94-3

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas

untitled

F477

5-1 nav css 5-2

中国软件2013校园招聘通知

06 01 action JavaScript action jquery jquery AJAX CSS jquery CSS jquery HTML CSS jquery.css() getter setter.css('backgroundcolor') jquery CSS b

无类继承.key

untitled

1. 2. Flex Adobe 3.

Microsoft Word - 最新正文.doc

摘 要 本 校 多 媒 體 設 計 系 與 上 海 戲 劇 學 院 創 意 學 院 在 多 次 聯 繫 交 流 之 下, 已 簽 署 合 作 備 忘 錄, 積 極 尋 求 兩 校 合 作 教 學 與 共 同 創 作 之 機 會 藉 由 本 系 學 生 作 品 腦 殘 公 寓 入 圍 第 五 屆 中

大漠 伪前端, 就职于淘宝

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

untitled

Microsoft Word - PHP7Ch01.docx

p.2 1 <HTML> 2 3 <HEAD> 4 <TITLE> </TITLE> 5 </HEAD> 6 7 <BODY> 8 <H3><B> </B></H3> 9 <H4><I> </I></H4> 10 </BODY> </HTML> 1. HTML 1. 2.

untitled

基于CDIO一体化理念的课程教学大纲设计

ebook 86-15

(CIP) Web /,. :, ISBN X.W T P393.4 CIP (2004) Web ( ) ( / ) : * 787

老码农原创小说《码农故事》

开发技术大揭秘册子内页_Vol.3_1123_预览版

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

XHTML width/height bdo a code href object charset codebase hreflang archive lang type alt dir name name xml:lang rel/rev align shape/coords hspace/vsp

Microsoft Word - FPKLSC_21.docx

untitled

VRML 2.0 < VRML vrml vrml vrml (Node) (Field) VRML (Virtual Reality) (1) (2)Three Dimension (3D) (3) (4) (5) (Virtual Reality Modeling LanguageVRML) (

F477

untitled

59 1 CSpace 2 CSpace CSpace URL CSpace 1 CSpace URL 2 Lucene 3 ID 4 ID Web 1. 2 CSpace LireSolr 3 LireSolr 3 Web LireSolr ID

mvc

javaexample-02.pdf

投影片 1

Java

PowerPoint プレゼンテーション

關於本書 Part 3 CSS XHTML Ajax Part 4 HTML 5 API JavaScript HTML 5 API Canvas API ( ) Video/Audio API ( ) Drag and Drop API ( ) Geolocation API ( ) Part 5

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

基于UML建模的管理管理信息系统项目案例导航——VB篇

XP11067_內文.pdf

Microsoft Word - ch04三校.doc

epub83-1


幻灯片 1

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

Chapter 9: Objects and Classes

Microsoft PowerPoint - ds-1.ppt [兼容模式]

版权页.indd

bootstrap - 2

目 录 第 一 章 调 查 介 绍 调 查 方 法 调 查 对 象 调 查 规 模 调 查 方 式 调 查 内 容 术 语 界 定... 4 第 二 章 报 告 概

云 浮 市 总 工 会 学 习 贯 彻 市 委 五 届 九 次 全 会 精 神 全 省 工 会 第 二 季 度 暨 上 半 年 劳 资 纠 纷 研 判 会 召 开 河 源 市 总 工 会 召 开 劳 资 纠 纷 研 判 会 议 湛 江 市 总 工 会 召 开 上 半 年 劳 资 纠 纷 研 判 会

PowerPoint 簡報

Adobe® Flash® 的 Adobe® ActionScript® 3.0 程式設計

用户大会 论文集2.2.doc

itestin 能 干 什 么? itestin 是 云 测 ( 提 供 给 广 大 移 动 应 用 测 试 者 或 者 开 发 者 免 费 使 用 的 一 款 安 卓 UI 自 动 化 测 试 录 制 工 具 ( 目 前 只 支 持 Android 应 用 程 序 的

标题

优迈科技教学大纲2009版本

3.1 num = 3 ch = 'C' 2

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

南京市人才服务中心

Chapter 9: Objects and Classes

我 们 再 看 到 尼 西 米 记, 也 会 发 现 当 时 神 的 百 姓 有 一 颗 单 纯 受 教 的 心, 他 们 单 纯 的 听 从 神 的 教 导, 敬 畏 遵 从 神 的 训 诲 当 他 们 明 白 自 己 的 罪 孽 时, 个 个 俯 伏 在 地, 为 罪 痛 悔 哭 泣 在 整 个

無障礙網頁開發規範二版(草案)

Mocat

untitled

臺銀人壽「98年九至十一職等人員甄試」

01

天仁期末個人報告1.PDF

RUN_PC連載_10_.doc

1.5招募说明书(草案)

标题

中南大学第二届软件创新大赛

Microsoft Word zw

浙江师范大学2014年度毕业生就业质量报告

目 录 监 管 资 讯 2016 年 全 国 保 险 监 管 工 作 会 议 召 开...3 协 会 动 态 赤 峰 保 险 行 业 协 会 召 开 数 据 统 计 和 信 息 宣 传 总 结 表 彰 会 议...5 赤 峰 市 保 险 行 业 协 会 秘 书 处 召 开 2015 年 度 述 职

同 时, 采 取 提 供 新 闻 线 索 和 素 材 安 排 专 访 等 方 式 主 动 为 新 闻 媒 体 服 务, 为 采 访 报 道 活 动 创 造 便 利 条 件 建 设 网 络 信 息 发 布 平 台 2013 年 9 月 开 通 中 央 纪 委 监 察 部 网 站,2015 年 1 月

公務員服務法第13條相關解釋彙整表

B1

時間軸上的竹蓮記憶 學務主任 黃雅彙 我不是竹蓮國小的畢業校友 但對於身為新竹人的我來 說 仔細回想起來 似乎和竹蓮有著一種特別的緣分 對竹蓮國小最初的印象是在小學的時候 猶記得年幼的 我經過一段時日的啦啦隊舞蹈訓練後 老師便帶著我們從學 校步行到竹蓮國小來參加比賽 一踏入竹蓮校門 映入眼簾 的是黑

B1

Microsoft Word - 临政办发6.doc

大陸教育部等6個部門公佈「現代職業教育體系建設規劃 ( 年)」規劃到2015年初步形成現代職業教育體系框架,到2020年基本建成「中國」特色現代職業教育體系

资 讯 速 递 台 基 于 大 数 据 的 学 校 督 导 评 估 系 统 建 设 上 海 市 闵 行 区 人 民 政 府 教 育 督 导 室 ( 摘 要 ) 闵 行 教 育 在 深 化 教 育 改 革 探 索 管 办 评 分 离 的 背 景 下, 把 教 育 督 导 评 估 系 统 建 设 作 为

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

final

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之

Oracle高级复制配置手册_业务广告_.doc

CC213

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

epub 21-22

Hippy-VueConf

Transcription:

可 Web 编程的 NativeUI 设计与实现 张袁炜

zhangyuanwei@baidu.com 欢迎转岗简历请发

About Me @ 张袁炜 直达号 网址导航 百度 音乐 前端 Node.js Android Arduino RaspberryPI https://github.com/zhangyuanwei

Outline 一个 Hybrid App 的进化史 Native UI 实现原理 架构设计 UI 构建 布局系统 Web 样式 支持 事件机制 性能优化 前端框架设计

一个 App 的进化

一个 App 的进化 地理位置 分享 摄像头 支付

一个 App 的进化 地理位置 分享 体验 交互 动画 性能 摄像头 支付

一个 App 的进化

一个 App 的进化

一个 App 的进化 CSS3 硬件加速? 改 WebKit? 单 页 面应 用? 手势跟随?

一个 App 的进化 WebView Native WebView WebView

一个 App 的进化 background page WebView WebView WebView // 系统原 生事件, // 新 activity 创建的时候触发 webview_regist // activity 销毁的时候触发 webview_unregist // var _events = ['webview_register', var bridge = window.lc_bridge; var webviews = {}; var status = { ACTIVE: 1, PAUSED: 2, STOPPED: 3, KILLED: 0 }; // 监听 activity webview 创建事件 document.addeventlistener('webview_reg if (!(event.origin in webviews)) { webviews[event.origin] = { origin: event.origin, status: status.active, data: event.data }; } });

代码重构 内存泄露 多 页 面通讯

理想架构? 性能好 ( 媲美 Native) 定制性强 ( 媲美 Web) 学习成本低 ( 最好为零 )

页 面增强 底层为 WebView Native WebView 覆盖透明 Native 组件层 Native 组件替换 Web 组件

页 面增强

页 面增强 页 面加载 是否有 Native 提取数据 / 样式 创建 Native 组件 初始化组件交互 隐藏 Web 组件 结束

Blend UI 系统架构 App Title Tab Dialog Toast Widget Factory Zepto Browser Javascript API Javascript <-> Native bridge Native

Blend UI 系统架构 Title Tab Dialog Toast View Text TextInput Image AlphaAnimation Element Animation Queue Javascript <-> Native bridge View Text TextInput Image Native AlphaAnimation

UI 构建 提 示信息 提 示内容 Dialog 确定 取消

UI 构建 提 示信息 提 示内容 确定 取消

UI 构建 提 示信息 View 提 示内容 View View View Text Text View View Text Text 确定 取消

UI 构建 createview("tag":string, "type":string, config :object) 根据给定的 config 配置, 创建 一个类型为 type 的基础 GUI 组件, 并指定 tag addview("parenttag":string, "childtag":string, index :number) 添加 childtag 所指定的 View 到 parenttag 所指定 View 的 index 位置 Javascript <-> Native bridge removeview("parenttag":string, "index": number) 从 parenttag 所指定 View 删除 index 位置的 子 View updateview("tag":string, "type":string, config :object) 更新 tag 所指定的 View

Blend UI 系统架构 Title Tab Dialog Toast View Text TextInput Image AlphaAnimation Element Animation Queue Javascript <-> Native bridge View Text TextInput Image Native AlphaAnimation

Blend UI 系统架构 Javascript <-> Native bridge Tag Map View Tree CssNode Tree View Text TextInput Image AlphaAnimation Native CssNode BorderDrawable Android View System

CSS Layout CssNode public void addchildat(cssnode child, int i) public void removechildat(int i) public void setflexdirection(cssflexdirection direction) public void setjustifycontent(cssjustify justifycontent) public void setalignitems(cssalign alignitems) public void setalignself(cssalign alignself) public void setpositiontype(csspositiontype positiontype) public void setwrap(csswrap flexwrap) public void setflex(float flex) public void setmargin(int spacingtype, float margin) public void setpadding(int spacingtype, float padding) public void setborder(int spacingtype, float border) public void setpositiontop(float positiontop) public void setpositionbottom(float positionbottom) public void setpositionleft(float positionleft) public void setpositionright(float positionright) public void setstylewidth(float width) public void setstyleheight(float height)

CSS Layout CssNode public void calculatelayout() public boolean hasnewlayout() public void marklayoutseen() public float getlayoutx() public float getlayouty() public float getlayoutwidth() public float getlayoutheight()

CSS Layout CssNode View Node View View View Node Node Node Text Text View View Node Node Node Node Text Text Node Node

CSS Layout CssNode flex:1 border:1 flexdirection: column Node border:1 justifycontent: center Node Node Node border:1 justifycontent: space-between Node Node Node Node Node Node

CSS Layout CssNode calculatelayout x:0 y:0 width:400 height:300 Node x:1 y:1 width:398 height:40 Node Node Node x:1 y:260 width:398 height:42 Node Node Node Node Node Node https://github.com/zhangyuanwei/csslayout

Blend UI 系统架构 Javascript <-> Native bridge Tag Map View Tree CssNode Tree View Text TextInput Image AlphaAnimation Native CssNode BorderDrawable Android View System

Border Drawable

Border Drawable

Border Drawable BorderDrawable https://github.com/zhangyuanwei/borderdrawable

Blend UI 系统架构 Javascript <-> Native bridge Tag Map View Tree CssNode Tree View Text TextInput Image AlphaAnimation Native CssNode BorderDrawable Android View System

Blend UI 系统架构 Title Tab Dialog Toast View Text TextInput Image AlphaAnimation Element Animation Queue Javascript <-> Native bridge View Text TextInput Image Native AlphaAnimation

事件机制 Javascript <-> Native bridge webview.loadurl( javascript:xxxx ); (function(){ var event = document.createevent( Event"); // 事件固定名称为 "boost", 方便 Js 统 一监听 event.initevent("boost", false, false); // 事件数据 event.data = somedata; // 事件源的 Tag event.origin = origintag"; // 具体的事件类型 event.boosteventtype = "touchend"; document.dispatchevent(event); })();

事件机制 Element document.addeventlistener("boost", function (e) { var target = getelementbytag(e.origin); if (!target) { return; } assert(target instanceof Element, target); var event = { type: e.boosteventtype, target: target, data: e.data, }; target.dispatchevent(event); }, false);

Blend UI 系统架构 Title Tab Dialog Toast View Text TextInput Image AlphaAnimation Element Animation Queue Javascript <-> Native bridge View Text TextInput Image Native AlphaAnimation

性能优化 Queue var view = boost.createelement("view"); view.style.position = "absolute"; view.style.top = 100; view.style.left = 100; view.style.width = 200; view.style.height = 200; view.style.backgroundcolor = "#ff6600"; var text = boost.createelement("text"); text.style.color = "#000000"; text.style.fontsize = 20; text.value = "hello world"; view.appendchild(text); boost.rootelement.appendchild(view);

性能优化 Queue var view = boost.createelement("view"); // createview view.style.position = "absolute"; // updateview view.style.top = 100; // updateview view.style.left = 100; // updateview view.style.width = 200; // updateview view.style.height = 200; // updateview view.style.backgroundcolor = "#ff6600"; // updateview var text = boost.createelement("text"); // createview text.style.color = "#000000"; text.style.fontsize = 20; text.value = "hello world"; view.appendchild(text); boost.rootelement.appendchild(view); // updateview // updateview // updateview // addview // addview

性能优化 Queue updateview addview createview updateview updateview createview Timer callqueue

性能优化 Queue function queue(callback) { var list = []; var running = false; function flush() { running = false; callback(list); list = []; } } return function (cmd) { list.push(cmd); if (!running) { settimeout(flush, 0); running = true; } };

性能优化 Queue updateview addview createview updateview updateview createview Timer callqueue

性能优化 Queue updateview addview createview updateview createview Timer callqueue

性能优化 Queue window.lc_bridge.callqueue("commands": jsonstring); [ // 第 一个命令 { "tag": string, // 需要调 用函数的 目标 Tag "method": string, // 函数名 "args": [ // 参数列表 object, // 参数 1 object, // 参数 2... ] }, callqueue // 第 二个命令 {... }, ] //...

性能优化 Queue updateview addview createview updateview createview Timer callqueue

性能优化 addview createview updateview updateview createview Js 反射 addview createview updateview updateview createview Native

性能优化 addview createview updateview updateview createview 提取 switch (methodid) { case 80: addview(); break; case 81: createview(); break; case 82: updateview(); break; default: break; }

Blend UI 系统架构 Title Tab Dialog Toast View Text TextInput Image AlphaAnimation Element Animation Queue Javascript <-> Native bridge View Text TextInput Image Native AlphaAnimation

Dom API 模拟 var view = boost.createelement("view"); view.style.position = "absolute"; view.style.top = 100; view.style.left = 100; view.style.width = 200; view.style.height = 200; view.style.backgroundcolor = "#ff6600"; boost.rootelement.appendchild(view); var text = boost.createelement("text"); Dom API 模拟 Style 属性 text.style.color = "#000000"; text.style.fontsize = 20; text.value = "hello world"; view.appendchild(text);

事件模拟 view.addeventlistener("touchend", function (event) { text.value = "doun't touch me!"; view.style.top = Math.random() * 400; view.style.left = Math.random() * 400; }, false); Dom 事件

HTML & CSS 解析 类 HTML 支持 CSS 样式 支持

CSS 选择器实现 jquery/zepto 支持

前端框架 Title Tab Dialog Toast XmlParser StyleParser jquery/zepto Widget View Text TextInput Image AlphaAnimation NativeElement CustmerElement NativeObject Element StyleSheet Selector Native EventTarget

Thanks