1. 引言
之前我们讲过一个helloworld.lzx的简单应用,来了解创建lzx程序的一些基本使用,在此基础上,需要对lzx来进行进一步的了解,下面我们会通过创建一个news.lzx来加深对 lzx的了解,主要是模拟新闻信息的显示和阅读。2. 需求分析
2.1 在news.lzx这个应用中,主要在应用中创建一个本地数据集来保存我们所要显示的信息,本地数据集需要在canvas中声明,通过<dataset>标签来进行定义。如:我们在该应用中创建的数据集。
<canvas width="240" height="320">
<dataset name="myData">
<news>
<item>
<title>胡锦涛在中央党校发表重要讲话</title>
<content>中共中央总书记、国家主席、中央军委主席胡锦涛25日在中央党校省部级干部进修班发表重要讲话。
</content>
</item>
<item>
<title>公安部通缉黑砖窑案疑犯</title>
<content>记者25日从公安部了解到,公安部近日对山西黑砖窑案中的8名在逃犯罪嫌疑人分别发出B级通缉令。
通缉令说,2007年3月份以来,山西省连续发生多起黑砖窑主非法限制民工人身自由、非法雇用童工、强迫民工超强度劳动、殴打民工致死、致残案件,在社会上引起恶劣影响。
</content>
</item>
<item>
<title>福建集中销毁六亿毒品</title>
<content>25日上午,福建省禁毒办在闽侯青口专业焚烧场所销毁4余吨各类毒品,它们是全省警方从2004年至今在打击毒品犯罪中缴获的。据介绍,这4吨毒品价值在6亿元人民币以上。
25日上午6时许,福建省禁毒办门口。
两辆军用卡车停靠在路边,两边各站一名手持抢支的武警战士。武警二支队的武警战士紧张地从仓库搬运130多编织袋及七八个大号塑料桶,里面所装的全部都是毒品...。
</content>
</item>
</news>
</dataset>
</canvas>
定义了一个myData数据集,里面包含了<news>根接点,<news>下面存在3条记录信息,每条信息里面分别有<title>和<content>两个结点,分别表示新闻的名称和内容。
2.2 显示的数据已经存在,接下来需要考虑在页面上如何显示这个信息,也就是页面的排版,在运行应用以后,首先显示的所有新闻的名称,并且焦点在第一条记录的位置上,可以按上下键进行选择记录,并按F3键或手机左功能键打开新闻,进行阅读。读完以后返回到界面。这样我们就需要把应用分成两个主界面,
﹡一个显示所有的新闻名称的界面。
﹡另一个显示内容的界面。
3. 编码详细讲解。
功能在上面我们已经基本上进行分析了,下面来讲一下具体的代码编写:3.1 创建界面。
根据上面的分析,需要两个主要界面,还有一个背景界面的显示,主要用来显示一些公共的信息如背景图片和左右按钮,具体代码如下:
<view id="bg" height="320" resource="images/rmw-background.gif" >
<text id="lb" x="30" y="295" fontsize="18" text="选择"/>
<text id="rb" x="170" y="295" fontsize="18" text=""/>
</view>
显示所有的新闻名称的界面的创建:
<view y="60" id="vNews" visible="false">
<attribute name="findex" type="number" value="0" />
<view x="2" y="0" resource="images/rmw-button-a.gif" />
<drawview id="drawbg" y="0">
<method name="drawrect" ><![CDATA[
this.clear();
this.rect(3,30,235,30);
this.strokeStyle=0xCA0002;
this.stroke();
]]></method>
</drawview>
<view fontsize="16" y="35" id="contID">
<simplelayout axis="y" spacing="20" />
<view datapath="myData:/news/item" fgcolor="#004276">
<view x="7" y="8" resource="images/rmw-ico-6.gif" />
<text x="12" datapath="title/text()" name="t1"/>
</view>
</view>
</view>
在这段代码中,新闻名称显示主要通过id为contID的视图来进行显示,显示时是通过数据绑定的方式来进行显示,t1显示的是具体的内容。移动焦点是通过drawview来画的,vNews视图默认设置成visible="false",还定义了一个自定义属性findex,类型为number型,默认值为0,用来控制当前显示的为第几条记录。
显示内容的界面:
<view y="60" visible="false" width="240" id="vread" >
<simplelayout axis="y" spacing="5" />
<text x="5" fontsize="16" fgcolor="#004276" name="t1"/>
<text x="5" fontsize="16" fgcolor="#004276" width="230" multiline="true" name="t2"/>
</view>
注意在这段代码中,由于内容比较多,所以在显示的时候,t2设置成multiline="true"自动换行方式,vread视图默认设置成visible="false"。声明数据指针:
<datapointer id="dp" xpath=""/>
3.2 事件执行
在该应用中,当初始化所有代码以后,需要执行oninit事件,如:
<handler name="oninit">
vNews.setVisible(true);
drawbg.drawrect();
</handler>
Oninit事件以后,首先需要把vNews视图设置成可见,并绘制焦点条。
当我们触发键盘时,会触发相应的键盘事件,
<method name="move" args="index">
if(vNews.getVisible() == true){
vNews.findex = vNews.findex + index;
if(vNews.findex < 0){
vNews.findex = contID.subviews.length-1;
}else if(vNews.findex == contID.subviews.length){
vNews.findex = 0;
}
drawbg.setY(vNews.findex*40);
}
</method>
<handler name="onkeydown" args="key" reference="LzKeys">
<![CDATA[
switch(key){
case 38: //up
this.move(-1);
break;
case 40: //down
this.move(1);
break;
case 33:
case 4108:
if(vNews.getVisible()){
vNews.setVisible(false);
vread.setVisible(true);
var str = "myData:/news/item["+(vNews.findex+1)+"]/content";
dp.setXPath(str);
vread.t2.setText(dp.getNodeText());
dp.selectPrev();
vread.t1.setText(dp.getNodeText());
lb.setText(" ");
rb.setText("返回");
}
break;
case 34:
case 4109: //right button
if(vNews.getVisible()==false){
vNews.setVisible(true);
vread.setVisible(false);
lb.setText("选择");
rb.setText(" ");
}
break;
}
]]>
</handler>
当按上下键时,会调用canvas下面的move()函数,在move()函数中首先判断当前显示的视图是不是vNews,如果时,对焦点进行移动操作,如过不是,则不进行处理。按F3或手机上左功能键时,如果当前视图是vNews,则关闭vNews视图,显示vread视图,通过datapointer指针读出当前数据集中记录的内容和名称,并把内容和名称设置到vread下t1和t2的text结点进行显示。如果当前视图不是vNews,按F4键或手机的右功能键返回到首界面也就是显示vNews视图。
