BlackBerry高级UI设计

作者: 王志刚

 

概论

 

 

 

 

这篇文 讲述 是如 Bla ckB erry 设备上应用 UI 效果 文档 的内容 括如 :

 

1 .     基于 M I D P UI

2 .     基于 3 rd -p art y UI lib rar y 的应用

3 .     基于 Bla ck Berr y UI 应用

4 .     基于 SV G(J SR 2 2 6) UI 设计

5 .     基于 Widg et UI 设计

 

本文的 成部 是以以一 个传统 动应 的九宫格 程序的 UI 计和 范例, 论并 重介绍 了在 Bla ck Berr y 平台上设 UI 需要 虑和 技术, 好的 Bla ckB erry 应用

 

通过对 UI 用的 本文也 及到 Bla ckB erry 用开 中如 三方应用 L ib rar y 集成, Bla ckBe rr y 网络应用 开发等 方面 知识,文 中涉及 的参 文档,都 可以从 RI M 开发 论坛上 载得

 

 

在阅读 参考 篇文档时 ,读者 该对 Bla c kBerr y 上的基 开工 和开发过 程有些 解, 果想 参阅这 内容 可以 Bla ckB erry 中国


 

1      MID P   U I 设计

 

 

 

   

上面的 是整个 M ID P L C D UI 组成 这个包 括完 M I D L P 高级和 UI 库。

 

1.1      M ID P UI

 

我们在 一节 介绍 L CD UI 库的具 组成 图。 Sc reen 属于 级图形用 户界面 Can v as 是低级 形用 界面组件 ,在同 时刻 只能有唯 一一个 Scr ee n 或者 Can v a s 类的子 显示 幕上。


 

 

使用 格这 实现 本身 可以

完成 的办 U I 组件 C u st o m Ite m , 制定是使 C ust o m I t e m 个九 图所示

 

 

 

源代码 下所 :

 

pub li c class Grid Ite m ex t en d s Custo m It em {

p ri v ate Im ag e i m ag e;

pub li c My Ite m (Im ag e i m ag e , Strin g t itl e,in t width ,in t h eigh t)

{

thi s.i m ag e = i m ag e ;

}

pub li c vo id pain t (Graph ic s g, in t w, in t h )

{


 

g .d rawI m ag e (th is. im ag e, w / 2 , 0 , Graph ics.H CEN TE R | Graph ics.TO P ) ;

g .d rawS tring (th is. title , w/ 2 , h - g .g e tFo n t( ).g et H ei gh t(), Graph ics.H CEN T ER | Graph ics.TOP );

}

 

 

 

通过对 For m   定制 ite m   置背 图片 找到 wo rk   ar o un d   办法 ,放置 们的 宫格图标 ,剩下的 是对 F o rm 序的设

 

Form f = new F o r m ("Cus to m Ite m " );

in t te m p Wid th = f.g et Wid t h () / 4 ;

in t te m pH eigh t = 6 0 ;

fo r(in t i = 0 ; i < 9; i ++ )

{

Strin g i m g Sr c = " / im g / " + i + ".png ";

tr y

{

I m ag e i m g = I m ag e.cre ateIm ag e(i m g Sr c);

My I te m m i = new M y It em (i m g ,String .valu eOf(i) + " ite m ", te m p Wid th,te m pH eigh t);

m i. se tL a yo u t ( It em . L A YOUT_ CEN TER ) ;

f.app end ( m i );

}

ca tch(IOE xce p ti o n i o e)

{

i o e.p rin tSta ckT ra ce( ) ;

}

}

d isp lay.setCu rren t( f );

 

1.2      M ID P UI

 

与高级 UI 比, UI 就自由 多, 何时候我 们可以 repa in t( ) 重绘事 ,调 完了

repa in t() 刻返 p ain t() 函数 另一个 门的线 程来完成

 

相对于 UI 富的组 ,低级 UI

 

我们从 ja v ax. m icr o edi ti o n .l cdu i. Can v as 开始 们的低级 UI ,我 要用 低级 UI 要继承

Can v as 抽象 ,在 C an v as 心是 p ain t() 个方法 这个 法做是负 责绘制 幕上 画面, 每当屏 需要 新绘制时 ,就会 生重 事件时, 系统就 自动 p ain t() , 并传入 Graph ics 对象。

 

 

任何时候 们都 以通 调用   reap ain t( ) 方法来产 生重绘事 ,它 两个 法,一个 参数, 分别用 指示 始坐标( X,Y , 长宽 另一 需要任 参数 代表整个 画面重 绘制。

 

我们可 通过 g e tWid th() g et H eigh t( ) 获得 C an v as 前范 大小 每当 Can v a s 围大 生变化 ,就 自动 Can v as 类的 siz e Ch ang e d ()方法。


 

下面是 用的 低级 CA N VA S A P I 绘制 宫格程序 的源码 :

 

public class MenuCanvas extends Canvas implements CommandListener {

private   String[] menuName = new String[] { "login", "picture", "wap",

"phone",   "call", "goto", "fuck", "music", "video" };

private int canvaWidth = -1, canvaHeight = -1;

private   int maxHeight = -1, imgWidth = -1, imgHeight = -1;

private int focus = 0;

private   int fontHeight = -1;

private   Image menuImg[] = new Image[9];

private Command exit;

 

public MenuCanvas() {

exit   = new Command("Exit", Command.EXIT, 1);

addCommand(exit);

setCommandListener(this); canvaWidth = getWidth(); canvaHeight = getHe ight(); try {

for   (int i = 0; i < menuImg.length; i++) {

menuImg[i] = Image.createImage(28, 28); Graphics g = menuImg[i].getGraphics(); g.translate(-28 * i, 0);

}

}   catch (Exception e) {

System.out.println(e.toString());

}

imgWidth = menuImg[0].getWidth();

imgHeight   = menuImg[0].getHeight();

fontHeight   = Font.getDefaultFont().getHeight();

maxHeight = imgHeight + fontHeight;

}

 

public   void paint(Graphics g) {

int   color = g.getColor();

g.setColor(0xFFFFFF);

g.fillRect(0,   0, canvaWidth, canvaHeight);

int cellWidth = canvaWidth / 3; int cellHeight = canvaHeight / 3; g.setColor(color);

for (int i = 0; i < menuImg.length; i++) {

g.drawImage(menuImg[i],   cellWidth * (i % 3)

+ (cellWidth - imgWidth) / 2, cell Height * (i / 3)

+   (cellHeight - maxHeight) / 2, Graphics.TOP

|   Graphics.LEFT);

in t fo nt Wi dt h = Fo nt .g et De fa ul tF on t( ). st ri ng Wi dt h( me nu Na me [i ]) ;

g.drawString(menuName[i],   cellWidth * (i % 3)

+ (cellWidth - fontWidth) / 2, cellHeight * (i / 3)

+   (cellHeight - maxHeight) / 2 + imgHeight + 1,

Graphics.TOP   | Graphics.LEFT);

if (i == focus) {

g.drawRect(cellWidth   * (i % 3) + (cellWidth - imgWidth) / 2,

cellHeight * (i / 3) + (cellHeight - maxHeight) / 2, imgWidth + 1, imgHeight + 1);

}

}


 

 

}

 

public void keyPressed(int key) {

int   action = get KeyAction(key);

switch (action) {

case   FIRE:

Alert   alert = new Alert("You select:", menuName[focus],

menuImg[focus], AlertType.INFO);

alert.setTimeout(Alert.FOREVER);

break;

case   UP:

focus   = focus - 3;

if (focus < 0) {

focus   = focus + 9;

}

break;

……

repaint();

serviceRepaints();

}

 

public   void commandAction(Command c, Displayable dpa) {

if (c == exit) {

}

}

}

最后得 的效 图如 所示

 

 

 


2 基于   Th ird pa rt y   UI 库的设计

 

直接使用 M I D P UI 来做应 界面 接口,很 多时候 要大 的编程和 设计工 。为 减轻 开发者 负担, J 2M E 台上也 很多 样的 UI 设计支 库, 节我 L WUI T 应用比较 广 泛的例 为例 说明如果 Bla ckB erry J2M E 上使用 GUI L ib rar y 去设 这个九 格程

 

2.1 L WUI T U I 库的设计规范

 

The L igh tw eigh t UI T oo l kit (L WUI T) 是一 轻量级 J a v aME UI 包。 L WUIT 类似 Swin g M VC 架构 , 支持多 布局 L ay o u ts , 皮肤 , , 摸屏 , 动画效果 , Rich , 3 D 集成 , P ain te r, 对画 , I1 8 N/ L 1 0 N 等。

 

Su n 2 0 0 8 年的 J a v aOne 上向开 区推荐了 L WUI T 预先发 的二 制文件 库,附 工具 扩展文档 ,让开 者可 快速上手 ,现在 Su n 个源代 都开放 来, 方便 开发者 L U WIT J av aM E 。关于 L WUI T 库的使 用, 以从 SU N 的官方 基本示 例和说 的文

 

 

九宫格 白了 是几个按 钮,摆 整整 齐。既然 是这样 先做个 M ain For m, Grid L a yo u t () 局,然 For m 几个按 ,每 个按钮代 表一个 F o rm

 

具体步 如下:

 

1 . M ain For m 中以 G rid L ayo u t 形式 列九 按钮

 

2 . 建立 Bas eFo r m, 加一个 Ba ckC o m m an d

 

3 . 创建 9 F o rm 继承自 BaseFo r m

 

pub li c class M ain F o r m e xt e nd s Fo rm im p l em ents A cti o n L ist ener {

pub li c st atic S trin g cu rre n tT ex t ;

C o mm an d Optio n _CM D = n ew Com m and (" ", 0 ); C o mm an d Exit _CM D = n ew C o m m and (" 退 ", 1 );

pub li c M ain For m () {

/ / 设置 体翻 效果

Tran siti o n in = C om m on Tran sitio n s.cr eateSlid e (Com mo n Tran si tio n s.S L IDE _HORIZON TAL, false , 3 0 0 );

s et Tran si tio n In An im at o r(in );

/ / 设置 cur rent Te xt 为了 点击 钮进入 For m 回退时 焦点 然在这 个按钮上

if (curr ent Te x t = = nu ll ) {

cur rentT ex t = " "; 九宫 说白 几个按 ,摆 整整齐齐 。既然 这样 先做个

M ain For m, Grid L a yo u t() ,然 For m 面做几 按钮 每一个按 钮代表 For m

 

 

 

 

se tL a yo u t(n ew B o rd erL ayo u t ()) ;


 

g e tT itl eCo m p o n ent().s et Vi sib le(fals e);

t ry {

 

St ring [] t ex t s = new String [] {

"m enu 1 ",

"m enu 2 ",

"m enu 3 ",

"m enu 4 ",

"m enu 5 ",

"m ene 6 ",

"m enu 7 ",

"m enu 8 ",

m enu9 };

/*

面是 L C D UI 页面布 的主 框架

*/

C o n tain e r bu tt o n Con tain er = n ew C o n tain e r(n ew Grid L ay o u t( 3 , 3 )) ;

f o r (in t i = 0 ; i < t ex ts .l eng th; i++ ) {

I m ag e un sel_i m g = r2.ge tIm ag e(i m gN am e s[i ] + ".png ");

fin al Bu tt o n b = ne w Bu tt o n (t ex ts[i] , un sel_i mg );

/ / set Ro ll o v erIc o n 当按钮 选中时

b .s et R o llo v erI co n ( r2.getI m ag e(i m gN am es[i] + "_se l.png ")) ; b .s et Al ignm ent(L a b el.CEN TER) ; b .s et T ex t P o siti o n ( L ab el.BOT TO M ); b .s et UII D (" D e m o B u tto n ") ; bu t to n C o n tain er.a dd Com p o n ent(b) ;

}

add C o m p o n ent (Bo r d erL ay o u t.CEN T ER, bu t to n Co n tain er) ;

add C o mm and ( Optio n _CM D ); add C o mm and ( Exit_ CMD ); add C o mm an d L isten er(t h is) ; sh o w ();

} catch ( IOE xce p ti o n ex ) {

ex .p rin tStac kT rac e() ;

}

}

}

}

}

 

 

最后 L WUIT 现的效果 ,和我 基于 M ID P 高级 UI 的效果 较相 。这 需要注 是,在 Bla ckBe rr y 使 用第 j ar 库的时 ,需 把相 JA R 库转成 Bl ackB erry 上可以 行的 c o d 件。

 

为什么 讨论 3 rd -p arty UI lib rary ,也 为了 Bla ckB erry 自己的 UI L i b rar y 的效 ,在 KVM 平台上 应用 UI 计, B lackBerr y UI L ib rar y 独树一 的。


 

3 基于   Bla ckBe rry   UI 组件的设计

 

使用过 L WUIT 的布 局组件 再使用 Bl ackB err y 原生的 UI 组件 设计 U I 就会发现 个非 悉。

Bla ckberry UI 件功 更多,使 用更 灵活也更 加便 关于 Bla c kBerr y UI 基本 件的 介绍, 可以参阅 B l ackBerry 基本 UI << Bla ckB erry 用户 面开 实例 >>

了解基本 UI 的设 之后, Bla ck Berry UI 布局组 ,可 设置 UI 组件到 Bla ckBe rr y 的效果, 可以得 一个 成的 Bla ckB erry UI 幕布局 现的 宫格 的介绍 这里 不详细叙 述了。

 

4 基于 SV G U I 设计

 

4.1   什么 S V G

 

SV G 是可扩展 2 D 矢量 编程 范, W 3 C 支持的 种标 ,我们这 个九宫 的主 UI 以用 SV G 相当 效果

在过去 年中 图像图形 技术曾 使出 印刷行业 发生了 场深 的技术革 命,使 老的 刷术 融入了 速发 的信息产 业。随着 In t ernet 技术 普及和 展, 像图形技 术作为 Web 技术 的基础 更将 建立一个 全新的 联网 业,发挥 至关重 的作 。然而, 目前的 In te rn et 技术 在图形 像方 ,应该说 还处在 轻阶 ,从浏览 器的核 技术 看,其对 于图形 像的 持还 仅仅局 于对 像的简单 显示, 着应 的逐渐深 入,图 技术 身的一些 缺点, 文件 大、 在不同 备上 示效果不 同等问 日益 出,从某 种程度 讲也 制了 We b 浏览技术 进一 展。

 

 

,众 业内人士 针对 W eb 浏览 图像 形功能 持较 这一缺点 提出了 进措 。近年 来,各 软件 商和组织 纷纷推 自己 矢量图形 规范, 要代 Ad o b e Syste m s Inc. 制定的 P GM L P re cision Graph ics M ark u p L angu ag e )、 CC L RC 提出的 Web Sch em a tic s Au to d e sk, In c 和微 软等提 VM L Ve ct o r M arku p L angu ag e )。 外,一 公司 始制作自 己的 p lu g-in 来支持矢 量图形 浏览 但这些插 件都由 缺乏 平台的支 持,以 没有 好的配套 编辑工 ,而 能得 到网上 广泛 用。正是 在这种 况下 为统一标 准,结 目前 混乱局面 W3 C 组织于 1 99 8

8 专门成 SV G 工作组 力于 形标准的 制定工 ,并于 1 9 9 9 2 1 1 发布了 一个 讨论草 ,后 经修订于 最近发 草案。

 

SV G 是一种 X M L 用来描 二维 量图形和 / 点阵 合图 标语言 其全 是可升 级矢量 形规 Scal ab l e Vec to r Graph ics 。其 中, " 扩展 " scalab le 在图形 像技 上指的 是它不 限于 个固定的 分辨率 大小 譬如可以 在不同 辨率 屏幕上以 相同的 小显 ,也 可以在 一个 页中以不 同的大 或观 局或观细 节;而 网络 术上指的 是这一 范能 与其 它规范 融合 从而满足 更广泛 用户 求,适合 于更广 的应 方式 " 矢量 " v ec to r )是 范中描 了直线 、曲线、 何图 ,而无须   P N G JP EG   图像 式那样 象素 行描 这使得 成了 SV G XM L 文档 小, 载速度也 大大提 " " g rap h ics )是 它提 了对


 

矢量和 / 栅格 形的描 ,填 了大多数 基于 X M L 的置 语言 范对复 图形 述的空 白。

 

SV G 规范定 SV G 征、语 和显 效果,包 括模块 X M L 间( n am espace )和

SV G 文档对 模型 ( D O M ) 。在以 的草 中, SV G 定义 一个 D T D 这个 D TD 支持样 单的 引用。 这样 来, SV G 就不再 一个 定义的全 包容的 言规 ,而需要 浏览工 额外 有对 样式单 件的 理能力。 出于这 考虑 在新近出 台的 SV G 八个 ,为 SV G 了两种 不同的 式, 样式化 S VG 和交换型 SV G ,它 各自有 同的 D TD M IME 。样 SV G 许对图 对象 行样式添 加,它 以通 引用外部 样式文 、在 件头中预 先进行 式声 和通 过属性 元素 义样式三 种方式使 用样 单,是 S VG 用于网 环境 存储格 。而 换型

SV G 取消了 样式 持,完 使用 素属性描 述各个 形对 的显示效 果。在 来的 络传 输中, 换型 S VG 当现在 刷业广 泛使用的 图形格 --E P S 式的 络版。 且, 于所有 显示信 都封 X M L 的属性 ,交 SV G 可以作为 XSL T 转换后所 得到的 果文 格式, 广泛应 X M L 示效果 描述

 

4.2 M o bil e s v g

 

J 2M E J a v a 2 内三大 要分 之一,其 目的在 供诸 手机 PD A 等消费 电子产 嵌入式 统开 应用程式 的平台 简单 说,只要 手机厂 在其 业平台上 提供可 执行 J 2 M E

J AV A 虚拟机 (KVM ) 则利用 J 2 M E 开发出来 的应用 式便 在该手机 上直接 J 2 M E 主要的 意是 望能把手 机厂商 软体 商连结起 来,弥 在消 性电子产 品或嵌 式系 上开 发应用 式的 口。由于 现阶段 机大 皆采 J 2M E 平台 包括 N o ki a M o t o ro la Son y

Ericsso n Si e m ens 等, 因此在 J 2 M E 台的 手机逐 普及 下,软体 厂商也 理成 的提高 了在手 上开 应用程式 的意愿。

于此 负责 J av a P r o fil e J CP 组织, 2 0 0 4 公布 了一个 于行 平台

2 D 矢量 形功 (P ac kage) -Scal ab le 2 D V ect o r Graph ics A P I 因其 J SR(J av a Sp ecifi cati o n Requ est ) 标号 2 2 6 故我们 J SR 2 2 6 J SR 2 2 6 是由 N o kia 家手 大厂主 制订 ,其他 的专家 (Ex p er t Gr o up ) 员包括 S o n y Eric sso n M o to r o la Si e m ens Su n M ic ro sy s te m s TinyL in e IBM T ex as In strum ents Sym b ian .. . 等等。

J 2 M E 发环境上 J SR 2 2 6 格定 缩放 2 D 图形 程式界 ,并 须支

SV G   Tiny   P ro fil e 相容于 SV G-T   1 .1 行平台和 Open VG 差不 多,皆 用于 忆体容量 屏幕大 及计 效能有限 的行动 置上 但有 Open VG 的是, J S R 2 2 6 一套 为高 矢量绘 标准 此规格提 供了可 来绘制 Sc alab le 2 D v e ct o r i m ag es A P I 件,其 包含了 SVG 格式的 像档。

由于 J SR 2 2 6 SV G T in y P r o fil e 特性 关係, J SR 2 2 6 具有延 机制 能力。 随着 SV G pr o fil es 能的发 ,才 达到完全 支持的 果。 J SR 2 2 6 能透过 Open VG 函式库 加以 作,并且 充分利 矢量 形硬体加 速的功 ,对于 J SR 2 2 6 效能的 现绝 有正 面的助 。最 说明 J SR 2 2 6 程式界 的应 ,主要 目包 地图视觉 化、可 放的

(ico n ) 及其 必须符合 自由缩 需求 进阶应用

 

4.3 R I M s v g

 

借助于 SV G 现九 局,我 UI 修改就 常方便 们这 部分 SV G 子,希 望达到 效果 使用 SV G 原始文 来布 我们的九 宫格 UI 时, RI M J SR2 2 6 的支


 

来对用 界面 件做出响 应。通 这个 式,我们 可以熟 和了 Bla ckB erry SV G 过程和 法。

 

 

 

根据最 Bla ck Berry Bro ws er 规范 sv g tin y1 .2 已经在 Bla ckB erry 得到了 持。

Bla ckBe rr y SV G 的支 H T M L 成,也 以采用 J a v a 地应用 方式 集成。

 

步骤一

 

编辑原始 SV G 文件

 

由于 SV G 是一种基 XM L 的标 ,所以 有很 基于 XM L 编辑 格的 具来 原始 SV G 。一 Ad o b e sv g v iew , 一个中 人开 的工具, SV GD e v el o p er

 

对于 SV G 辑, 以用 Bla ck Berr y 的自己的 选择 P laz m ic Co m po ser f o r BlackB erry Smartph o n es 个工 本身是 来作为 Bl ackB err y 上的 题和 画制作的 工具 是它 可以用 来对 SV G 编辑。

 

在第 6 章,我 也会介绍 用这个 具来 Bla ckB erry 的主 和动

 

在这里 SV GD ev elo p e r 为例, 明一 基本的 SV G 文件的 辑已 开发过 ,关于 SVGDevelp er 使用和安 装下载 可以 SVGDe velper 官方 面我们使 SVGDevelo per 辑一个 s ample.sv g 文件


 

 

 

 

对于生 sa m p le.svg 源文件 如果 开,可以 看到如 内容 我们分别 解释如

 

<? x m l v ersi o n =" 1 .0 " enc o d i ng ="u tf -8 " stand alon e= "n o "? >

 

<!D O CTY P E s v g P UB L IC " - / / W3 C / / D T D SVG 1 .1 / / EN " " h tt p : / / w ww . w3 . o rg / Graph i cs/ SV G /1 . 1 / D T D/ s v g 1 1 - fla t-2 0 0 30 1 1 4 .d td">

 

<sv g width =" 4 8 0 " h eigh t= " 3 6 0 " v ersi o n =" 1 .1 " x m ln s= "http: / / ww w.w3 . o rg/ 2 000 / sv g "

xm ln s: xlin k= "h tt p : / / ww w. w3 . o rg/ 1 9 9 9 / xlin k" >

 

上面的是 SV G 源文 就是 X M L 件的 ,描述了 SV G 的版 x m l 本信息

 

<im ag e id=" m enu i m g 1 " x = "7 5 " y ="5 9 " w id th= "8 1 " h ei gh t= "5 8 " xlin k: h ref= "titl e0 _png _1 _i m g _1 _1 .png " tran sfo r m =" m atrix (0 . 9 9 9 9 9 9 9 ,0 ,0 , 0 .5 2 , -33 .0 0 16 7, -9 . 7 6 0 3 33 ) " xm ln s: xlin k= "h tt p : / / ww w. w3 . o rg/ 1 9 9 9 / xlin k" x m ln s= "http: / / ww w.w3 . o rg/ 2 000 / sv g " / >

 

<!— i m ag e 2 t o 8 -->

 

<im ag e id=" m enu i m g 9 " x = "3 8 3 " y ="2 78 " w id th= "1 0 7 " h eigh t= " 5 5 " xlin k: h ref= "titl e8 _png _1 0 _i m g _1 _1 .png " tran sfo r m =" m atrix (1 , 0 , 0 ,1 , - 46 ,- 4 0 )" xm ln s: xlin k= "h tt p : / / ww w. w3 . o rg/ 1 9 9 9 / xlin k" x m ln s= "http: / / ww w.w3 . o rg/ 2 000 / sv g " / >

 

上面的时 xm l 文件 i m ag e 分, 就是我们 sv g 件中 入图标文 件的内 。菜 图标 2

8 省略掉


 

<t ex t x ="7 7 " y ="1 29 " space ="p reser v e " f o n t -fa m il y = "T ah om a " f o n t -siz e= "1 2 " fil l= "#0 0 0 0 0 0 " stro k e= "n o n e" st r o k e -o p ac ity =" 0 " tran sfo rm =" m atrix( 2 .49 ,0 , - 0 .0 67 , 0 .9 9 9 9 9 9 9 , -1 42 .67 4, -5 2 .0 0 0 32 ) " xm ln s= "http: / / ww w.w 3 .o r g / 2 0 0 0/ s v g ">

 

m enu 1 </ te x t>

 

<!— m un u t ex t 2 to 8 -- >

 

<t ex t x ="7 7 " y ="1 29 " space ="p reser v e " f o n t -fa m il y = "T ah om a " f o n t -siz e= "1 2 " fil l= "#0 0 0 0 0 0 "

stro k e= "n o n e" st r o k e -o p ac ity =" 0 " tran sfo rm =" m atrix( 2 .49 ,0 , -

0 .06 7 0 0 0 0 1 ,0 . 9 9 9 9 9 9 9 , 1 65 .31 6 4 , 1 7 5 .9 8 9 6 )" x m ln s="h tt p : // ww w. w 3 . o rg/ 2 0 0 0 / s vg ">

 

m enu 9 </ te x t>

 

上面的时 xm l 文件 单项的 字描 部分,也 就是我 sv g 文件中引 入菜单 述的 容。 菜单文字 2 8 了。

 

<lin e id =" m enu lin e 1 " id x 1 = "1 9 " y 1 ="7 7 " x 2 = "1 29 " y 2 = "7 7 " str o k e= " #0 0 9 9 CC" st r o ke - o p acit y =" 1 " tran sfo r m =" m a trix( 0 .6 1 29 9 9 9 ,0 , 0 , 0 .9 9 9 9 9 99 , 44 . 9 7 2 3 9 ,1 37 . 9 9 71 ) " o p acit y =" 1 " s tro k e -width = "4 " xm ln s= "http: / / ww w.w 3 .o r g / 2 0 0 0/ s v g " / >

 

<!— m un e und erlin e 2 t o 8 -->

 

<lin e id =" m enu lin e 9 " id x 1 = "1 9 " y 1 ="7 7 " x 2 = "1 29 " y 2 = "7 7 " str o k e= " #0 0 9 9 CC" st r o ke - o p acit y =" 1 " tran sfo r m =" m a trix( 0 .6 1 29 9 9 9 ,0 , 0 , 0 .9 9 9 9 9 99 , 1 8 7 .9 7 3 4 ,1 38 . 9 9 76 ) " o p acit y =" 1 " s tro k e -width = "4 " xm ln s= "http: / / ww w.w 3 .o r g / 2 0 0 0/ s v g " / >

 

</ s v g >

 

上面的是 xm l 文件 单项下 的高 的下划线 部分, 就是 们在 s v g 文件中 入菜 突出 的内容 下划线 2 8 省略掉

 

步骤二

 

 

对于 SV G 的原 文件 操作, 们可 直接选择 基于浏 器上 作, D O M J av ascrip t 式, 通过 Widg et 技术 览器应 直接 作。还有 一种选 是使用 J 2 M E AP I 来对 SV G 文件 行操 作。在 文中 我们选择 使用 J 2 M E A P I 来对 SV G 原始文 进行 作,达到 的效果 ,当 户选择

  SV G 图标 ,响 标会出

 

建立 J av a 应用 添加 个基本 基于 can v as 用的的 ja v a 中,这个 应用需 下内 :

 

由于我 是一 九宫 UI 应用 序, 虑的就 对用 键盘输入 的响应 这里 两种 可以响 获取 键盘或者 滚轮之 的手 用户输入 时间, 种方 是通过 ca n v as 应接 ,正 如前面 UI 法中应 的那 。另外一 种方式 通过 SV G 元素 身提供 现的 件响应 接口来 获获 用户输入 事件。


 

o rg .w3 c.do m .e v ents 户输入 件提 的事件类 型包括 下几 类型

 

click 点击

 

D O M Acti v ate clic k 类似 D O M FocusI n 获取 D O M Focus Out 点移出 相应的 理示 逻辑如下 所示

 

Ev ent L ist ener list en1 = ne w M y E v ent L isten er() ;

 

/ / L ist en t o cli c k e v en ts, d u rin g t h e bubb lin g ph ase

 

SV GElem ent m y Rec t = (SV GE le m ent)d o cu m ent.g et El em entBy Id ( );

 

my R ect .add E v ent L ist ener(" click", li s te n 1 , false );

 

由于本 ite m 比较多 就不 一实现这 样的方 了, canv a s 获取滚 移动 后动 态显示 划线 方式就可 以了 5 ,我们会 继续讨论 d o m 的编程 法。

 

J SR22 6 SV G 发过程 ,需 引入的主 如下 个:

 

im p o r t ja v ax. m icro edi ti o n .m2 g .* ;

 

im p o r t o rg .w3 c.d o m .*;

 

im p o r t o rg .w3 c.d o m .svg.* ;

 

正如名 所示 这几个 p ackage 具体 用就不详 述了 SV G 元素 用到 M I D P 的高级 UI 组件上 也可 应用到 M IDP 低级 UI 件上。这 里我们 是以 Can v as 例说明 SV G Bla ckBe rr y UI 的使用。

 

class M y SV GCan v as ex t end s Canvas

{

 

p ri v ate SVGI m ag e _i m ag e;

p ri v ate Scalab leGraph ics _sg;

 

My SV GCan v as(SV GI m ag e im ag e) t h r o w s IOE xce p ti o n

{

_im ag e = i m ag e;

_sg = S calab leGraph ics .createInst an ce( ) ;

}


 

 

pub li c vo id pain t (Graph ic s g)

{

if( _ i m ag e   = = nu ll )

{

r et u rn ;

}

 

 

/ / Bin d t arg e t Graph ics t arg et to rend er to .

_sg.b ind Targ et (g) ;

D o cu m ent d o cu m ent = _i m ag e .g et D o cum ent() ; F o r ( in t i=1 ; i < =9 ; i++ )

{

SV GEl em ent m enu li n e = (SV GEle m ent ) do cum ent.g et Ele m en tBy Id ( m enu lin e” + i);

if (i = = fo cus)

m enu lin e . s et Trai t (" v isib il ity " , v isib le );

else

m enu lin e . s et Tr ait ( "v i sib il ity ", h idd en ) ;

}

 

 

/ / Set o u r v ie wpo r t d i m ensi o n s.

_im ag e.set Vi ew p o rtWi d th(_canvas Wid th) ;

_im ag e.set Vi ew p o rtHe igh t(_canvasH eigh t);

/ / Re nd er t h e sv g i m ag e ( mo d el) an d x / y =0 / 0

_sg. rend er( 0 , 0 , _ i m ag e);

/ / Re l ease bind ing s o n Graph ics

_sg. releas eT arg e t() ;

}

 

 

pub li c vo id ke y P r esse d (in t key ) {

in t acti o n = g et K ey Ac tio n (k ey ) ;

switc h ( acti o n ) {

case FI RE :

Al ert aler t = new Alert( "Y o u se lec t: ", m enuN am e[fo cu s], m enu Img [f o cus] , Al ertT y p e .IN FO);

alert.set Ti m e o u t(Al er t.FOR EVER);

b reak;

case U P :

fo cus = fo cus - 3;

if (fo cus < 0 ) {

fo cus = fo cus + 9 ;

}

b reak;

……

repa in t();

serv ic eRe p ain t s();

}

}


 

m id le t 序中加入如 下初始 逻辑

 

p ri v ate st a tic fin al St rin g SVG_URL = " / sa m p le.s v g "; SV GI m ag e im ag e = l o ad SV GImag e(SV G_U RL ) ;

C an v as can v as = n e w M y SV GCan v as(i m ag e) ;

 

步骤三

 

编译打 ,把 J av a 生成相 c o d 文件,下 载到真 或者 拟器上, 可以观 到我 SVG

技术 b ase 九宫 UI 效果

 

 

 

5 基于 Bla ckBe rry W id get U I 设计

 

对于九 格的 种有趣的 是用 Wid g et 计一个纯 UI 或者 有的 UI 工作都 Widg et

技术,通过 Widg et   或者 BB   供的 用通 和交互,让 Widg et   台的 J av a   应用 行通

 

在本应 中, 们通 H T M L 中加 SV G 式,在 Wid g et 应用 中放入 们的 宫格程序 在实际 用中 没有必要 采用这 方式 可以直接 通过 H T M L 面嵌入 I M A GE 文件 方式 现。

 

开发步 ,第 :

 

S v g Ad o b e 倡议的 xm l 基于的 档规 ,后来也 被列入 W3 C 标准之中 ,所以 SV G 面中 件响应 脚本 法很多, 包括的 法有 S M IL Attribu te s 方式、 J a v aS c rip t+ SMIL 方式、 Ev ent L ist ener ) 根据 不同的 要让 家有更多 的选择 我们 里以 ja v a scrip t e v entlis te n er 方式来 写我 的九宫格 的菜单 写方

 

在我们第 4 sv g 文档 中,加 如下 本内容


 

<scrip t>


 

 

<![CD ATA [

v ar s v gn s = "http: / / w ww .w 3 .o rg / 2 0 0 0/ s v g " ;

fun ctio n m ak eSh ap e() {

v ar s v gD o c ;

v ar v arm enu im g 1 = w indo w.doc u m ent.g e tEle m ent By Id ("m enu i m g 1 " );

v ar v arm enu li ne;

/ / v ar m enu lin e.se tAttribu te N S(nu ll , "v isib il ity ", "hidd e n ");

v ar i = 1 ;

fo r (i =1 ; i< 1 0 ; i+ +)

{

v arm enu lin e = w indo w.doc u m ent.g e tEle m ent ById(" m enu lin e" + i );

v arm enu lin e.set A tt ribu te N S(nu ll , "v isib il it y ", "hidd en" );

}

v arm enu im g 1 .add Ev en tL ist ener("clic k", chang eVisib le, false) ;

}

fun ctio n ch ang eVisib le (e v t) {


 

 

 

v ar v arm enu lin e1 _i = wind o w.do cum ent.g et Ele m entB y Id ("m enu lin e4 " );

v arm enu lin e1 _i.setAt tribu t eNS (nu ll , "v isib il it y ", "v isib l e");

}

m ak eSh ap e();

]]>

</ scrip t >

由于这 采用的 h tm l 方式 sv g 所以我们 可以 P C 浏览器中 调试观 这个 s v g 效果 到浏览 下载了 Ad o b e sv g v ie we r 件后,可 以用浏 器直 打开 sv g 件进 查看

看鼠标 击的 际效果。 也可以 开包 这个   s v g   h tm l 文件。


 

 

 

 

上面的 打开 面时候的 效果, 后点击 m enu 1 的图标 下面 下划线会 出现如下

 

 


完成这 的工 之后,可 以对这 页面 行大小的 适配, 它满 我们的真 实手机 大小 果, 到这里 sv g 的页面的 开发工 都已 完成。

 

最后参考 widget 开发 我们的 h t m l 件转成 Bla c kBerr y co d 文件,然 根据

widget 开发提高篇 ,在 我们的 面菜 的响应事 件中加 对具体 J a v a 用调用 工作 到这 个结合了 Widg et / SV G/ J a v a 应用的 用界 的算完 了。

 

 

 

BlackBerry SDK下载

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值