使用Sencha Touch 开发跨平台移动 Web 应用文档格式.docx
《使用Sencha Touch 开发跨平台移动 Web 应用文档格式.docx》由会员分享,可在线阅读,更多相关《使用Sencha Touch 开发跨平台移动 Web 应用文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
中第二个界面所示的嵌套列表(NestedList)则非常适合于展示信息有层级关系的情况,如浏览论坛时的“讨论区->
主题帖->
原帖及回复内容”这样的层次关系。
图2列表组件
精致形象的图标和布置合理的工具栏是AppleiOS原生应用引以为傲的部分,而SenchaTouch也可以做到这一点。
图3中第一个界面所示的是框架内置的图标样式,已可以满足大部分应用的需要,开发人员还可以通过自定义图标样式来扩展出更多更丰富的图标。
如图3中第二个界面所示,图标所在的工具栏布置方式也灵活多样,即可在屏幕顶部或者底部,也可以多个层叠,并可以在工具栏上布置形状各异的按钮。
图3中第三个界面所展示的是根据底部Tab标签页而进行切换的面板,不同的面板中可以包含不同的主题内容。
图3图标、工具栏和标签页
如果你以为SenchaTouch只能做到以上这些小儿科,那就错了,下面展示了一些高级的UI功能。
图4中第一个界面类似于AppleiOS设备上的SpringBoard操作,可以通过手指的左右或者上下滑动,来旋转切换界面窗口;
图4中第二个界面显示了一个窗口重叠的效果,当上层弹出窗口激活时,下层窗口的操作是被屏蔽的,在提醒用户执行一些重要操作的场景中(如删除或者保存),这样的UI组件是非常好用的。
图4旋转切换与窗口的重叠效果
酷炫的动画效果
一直以来,基于浏览器的Web程序动画效果常被人诟病,尤其是基于JavaScript的动画效果库相对于原生的应用程序来说,还是存在一定的差距,而刚发布的SenchaTouch1.1.0版本就支持多达六种动画效果,分别是cube、fade、flip、pop、slide和wipe。
以最为酷炫的3D旋转Cube动画为例,它将当前显示的界面面板(称之为Card)想象为立方体的一个面,而即将展示的Card作为相邻的另外一个面,以左上方的顶点作为旋转基点进行旋转,从而得到Card之间切换的动画效果。
大家一定很好奇它是如何做到这一点的,我们通过查看该动画效果的源代码即可找到答案。
图5Cube动画效果示例
在文件sencha-touch-1.1.0\src\core\Anim.more.js中,可以看到以下代码片段
清单1
this.from={
'
-webkit-transform'
:
rotate'
+rotateProp+'
('
+fromRotate+'
deg)'
+
(showTranslateZ?
translateZ('
+fromZ+'
px)'
'
)+fromTranslate,
-webkit-transform-origin'
origin
};
this.to={
+toRotate+'
deg)
+toZ+'
+toTranslate,
由于SenchaTouch的动画组件是基于Webkit核心的浏览器,所以其动画效果实际上是基于Webkit的3D转换引擎,代码中this.from指的是当前Card如何旋转消失的属性,而this.to指的是要目标的Card如何旋转得以呈现,具体CSS属性的含义可参考
官方文档
。
基于Web的博客浏览示例:
应用开发环境的搭建、代码结构及测试
随时随地获取自己想要关注的信息是移动计算环境最直接的用途。
本文将以一个简单的博客订阅与浏览程序为例,展示基于SenchaTouch进行移动Web应用开发的流程,帮助开发人员更快的熟悉该编程框架。
博客订阅与浏览应用的主要功能是订阅自己关注的博客RSS源,浏览对应博客的主题列表,查看博文内容。
为了实现以上需求,开发人员需要完成以下几个步骤的工作。
搭建开发环境
第一,下载
SenchaTouch库文件
,并将其解压到本地目录%sencha-touch-home%;
第二,进入EclipseJavaEEIDE,创建一个名为myblog动态Web工程;
第三,在本地安装ApacheTomcat6.0.x,在eclipse中将其配置为Webserver并将myblog工程部署其中以备测试;
第四,安装AndriodVirtulMachine环境,用以启动一个虚拟设备来测试Web应用的效果。
需要说明的是,对于静态的SenchaTouch工程,Tomcat并不是必须的,可使用任意HTTPServer来部署应用,但由于本例中使用了Servlet解析RSS源来降低客户端负载,因此采用了Servlet容器Tomcat。
创建代码结构
一个典型的SenchaTouch工程主要由几个部分组成:
sencha-touch库文件,JavaScript文件,CSS文件,图标文件以及静态HTML文件。
sencha-touch库文件至少要包含默认的CSS文件sencha-touch.css和默认的JavaScript文件sencha-touch.js,值得一提的是,为了便于在开发调试阶段更准确地定位和解决问题,开发包中还包含了CSS和JavaScript对应的debug版本,开发人员可在开发阶段使用该版本,而在产品部署阶段再替换为对应的正式版。
图6工程目录结构
创建HTML和JavaScript文件
创建SenchaTouch应用的第一步就是创建一个HTML首页文件用于链接SenchaTouch库的CSS和JavaScript文件。
我们博客浏览示例的HTML文件是index.html,其内容如下:
清单2
<
html>
<
head>
metahttp-equiv="
Content-Type"
content="
text/html;
charset=utf-8"
>
title>
MyBLOG<
/title>
linkrel="
stylesheet"
href="
sencha-touch/resources/css/sencha-touch.css"
type="
text/css"
css/index.css"
scripttype="
text/javascript"
src="
sencha-touch/sencha-touch-debug.js"
/script>
js/index.js"
/head>
body>
/body>
/html>
当创建好HTML文件之后,接下来就需要创建应用程序的JavaScript文件index.js,由于该示例是以浏览为主,因此选用NestedList组件作为UI界面的主体,相关代码如下:
清单3
Ext.setup({
icon:
img/icon.png'
tabletStartupScreen:
img/tablet_startup.png'
phoneStartupScreen:
img/phone_startup.png'
glossOnIcon:
false,
onReady:
function(){
.......
varnestedList=newExt.NestedList({
fullscreen:
true,
title:
我的订阅博客'
displayField:
text'
dockedItems:
[topbar,bottombar],
store:
store,
getDetailCard:
function(record,parentRecord){
returnnewExt.ux.DescBox({
value:
Loading...'
scroll:
{
direction:
both'
eventTarget:
parent'
}
});
}
});
......
}
});
可以看到,index.js的第一行代码调用了Ext.setup()方法,用以建立一个触控设备的Web页面,该方法可以为你的应用设置不同的启动属性和行为,例如示例代码中的:
icon,设置该应用默认的图标;
tabletStartupScreen,该属性设置在平板电脑上的启动图标;
phoneStartupScreen,该属性设置在智能手机上的启动图标;
glossOnIcon,该属性设置是否在默认图标上呈现光环效果;
onReady,该方法会在页面加载完毕,浏览器中的DOM模型已经建立完成时被调用。
由于为了保证程序在运行时所依赖的JavaScript文件都已经加载完毕,我们一般将应用启动的逻辑置于该方法内,类似于Java程序的main方法。
在定义NestedList组件时,有四点值得我们注意:
1.界面布局:
通过dockedItems属性,指明了NestedList顶部和底部分别放置了工具栏topbar和bottombar,topbar主要用来便于用户登录和设置偏好信息,bottombar主要是用来提供浏览博客时的一些常用操作,如订阅新的RSS源,删除选择的博客,刷新博客列表,给好的博文加星推荐以及回复功能。
为了生成工具栏,需要生成一个Ext.Toolbar对象的实例,以bottombar为例,其代码如下:
清单4
varbottombar=newExt.Toolbar({
dock:
bottom'
defaults:
ui:
plain'
iconMask:
true
},
scroll:
horizontal'
sortable:
layout:
pack:
center'
items:
[{
iconCls:
add'
handler:
function(btn,event){
addform.setCentered(true);
addform.show();
},{
trash'
refresh'
favorites'
action'
}]
该对象中主要定义了以下属性:
dock,工具栏的放置位置,可选值有top和bottom;
defaults,默认图标的UI效果,其中ui指背景颜色的样式,可选值有dark,light和plain;
scroll,滚动方向,可选值有horizon,vertical和both;
layout,表示工具栏图标的布局方式,示例中表示的是居中排列。
值得注意的是该属性应该由一个Object对象来指定而不是string;
items,该属性用于指定一个数组,来表示工具栏中的图标元素的集合,每个图标对象至少需要有一个iconCls属性来指定其样式,而handler属性则用于指定处理图标点击事件的方法,该方法回调时会传入两个参数function(btn,event),第一个指当前被触发事件的对象,第二个指被触发的事件类型,本例中通过该方法弹出一个表单窗口用于提供给用户输入感兴趣的博客RSS订阅源。
图7RSS订阅源添加表单
2.获取数据:
从后台通过相关API获取数据并展示在UI组件上,是实现Web应用的核心问题,SenchaTouch组件一般都是通过指定store数据源对象来实现的。
例如在本例中,采用Ext.data.TreeStore对象来定义在NestedList中层次化数据的获取,其相关代码如下:
清单5
Ext.regModel('
ListItem'
{
idProperty:
fields:
name:
type:
string'
link'
description'
varstore=newExt.data.TreeStore({
model:
proxy:
ajax'
url:
/myblog/list'
reader:
type:
tree'
root:
items'
首先,通过model属性来指明返回数据的模型,该模型是通过Ext.regModel()方法来建立的,主要是为了告诉程序返回数据是什么结构;
其次,通过proxy属性来指明返回数据的获取方式,该框架中主要有两种Proxy,Clientproxy和Serverproxy,ClientProxy主要用于存储本地数据,其子类有三个:
LocalStorageProxy,在浏览器支持的情况下将数据保存至localStorage;
SessionStorageProxy,在浏览器支持的情况下将数据保存至sessionStorage;
MemoryProxy,将数据保存在内存中,但是当页面刷新时,数据都将会丢失。
Serverproxy主要用于存储一些通过远程请求服务器而获取的数据,它包括:
AjaxProxy,发送一个HTTP请求到相同域的服务器;
ScriptTagProxy,使用JSON-P发送请求到不同域的服务器。
本例中采用的是最为常用的Ajax方式通过请求servletURL(/myblog/list)来获取JSON数据。
3.自定义组件:
使用NestedList时,开发者要注意的是我们需要自己实现getDetailCard()方法,用于定义对叶子节点数据的查看UI组件。
非常幸运的是,SenchaTouch框架为我们提供了良好的扩展机制用于自定义组件,这为我们构建结构清晰、面向对象的JavaScript程序打下了基础,示例中展示了如何扩展出一个自定义组件,代码片段如下:
清单6
Ext.ux.DescBox=Ext.extend(Ext.Component,{
...
afterRender:
Ext.ux.DescBox.superclass.afterRender.apply(this,arguments);
this.description=this.getTargetEl().createChild({
tag:
pre'
html:
this.value
getValue:
returnthis.value;
setValue:
function(description){
this.value=description;
if(this.rendered){
this.description.update(this.value);
我们定义了一个博客内容描述信息展示组件Ext.ux.DescBox,它继承自Ext.Component组件,并且自定义了Get和Set方法,同时重写了父类的afterRender方法,其中第一行的代码Ext.ux.DescBox.superclass.afterRender.apply(this,arguments);
必须调用,指的是将子类的参数应用到父类的构造方法中,类似于Java程序中的super()方法;
第二行代码this.description=this.getTargetEl().createChild(...)指在Component组件中创建一个HTML标签pre,并将value的值放置于pre标签中。
4.事件处理:
人机交互和UI组件之间的切换,需要事件来驱动或触发,因此各UI组件都支持一系列特定的事件及其处理方法,可参阅
API文档
示例中需要依靠叶子节点触摸事件leafitemtap将显示界面切换为DetailCard,就需要在NestedList组件上注册处理方法,其代码为:
清单7
nestedList.on('
leafitemtap'
function(subList,subIdx,el,e,
detailCard){
vards=subList.getStore(),r=ds.getAt(subIdx);
detailCard.setValue(r.get("
description"
));
其回调函数的参数依次代表“触控条目(item)所在List组件”,“触控条目的ID”,“触控条目element对象”,“触控事件对象”和“接下来要显示的DetailCard组件对象”。
部署到ApacheTomcat6.x进行测试
编写好对应的HTML、JavaScript和后台处理的Servlet之后,可将动态Web工程打包成为标准的WAR包,部署至Tomcat的webapp文件夹,启动服务器;
随后打开AndroidVirtualDevices,启动其中的浏览器程序,并在URL地址栏输入http:
//<
localhostIPaddress>
8080/myblog/,便可以对该应用进行测试了,运行的画面如
图8
所示。
由于SenchaTouch应用的跨平台性,使用其他任意一款基于Webkit内核的浏览器,如iPhone4的Safari,也能得到相关的测试结果,而不仅限于文中示例的Android设备浏览器。
图8应用运行及测试画面
总结
开发与原生程序一样酷炫界