BlackBerryUI设计大全(五)

本文探讨了SVG(可缩放矢量图形)在移动设备UI设计中的应用,介绍了SVG的基本概念及其在J2ME和BlackBerry平台上的实现方法。通过具体的案例,展示了如何使用SVG创建动态和交互式的九宫格UI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4基于SVGUI设计

4.1  什么是SVG

SVG是可扩展2D矢量图编程的规范,它是W3C支持的一种标准,我们这个九宫格的主程序UI可以用SVG实现相当的动画效果

在过去十年中,图像图形技术曾经使出版印刷行业发生了一场深刻的技术革命,使古老的印刷术融入了高速发展的信息产业。随着Internet技术的普及和发展,图像图形技术作为Web浏览技术的基础,更将为建立一个全新的互联网行业,发挥至关重要的作用。然而,目前的Internet技术在图形图像方面,应该说还处在年轻阶段,从浏览器的核心技术来看,其对于图形图像的支持还仅仅局限于对图像的简单显示,随着应用的逐渐深入,图像技术自身的一些缺点,如文件较大、在不同设备上显示效果不同等问题日益突出,从某种程度上讲也限制了 Web浏览技术的进一步发展。

  为此,众多业内人士针对Web浏览器图像图形功能支持较弱这一缺点提出了改进措施。近年来,各大软件厂商和组织纷纷推出自己的矢量图形规范,主要代表有Adobe Systems Inc.制定的PGMLPrecision Graphics Markup Language)、CCLRC提出的Web SchematicsAutodesk, Inc和微软等提出的VMLVector Markup Language)。此外,一些公司开始制作自己的plug-in来支持矢量图形的浏览,但这些插件都由于缺乏跨平台的支持,以及没有较好的配套编辑工具,而未能得到网上的广泛应用。正是在这种情况下,为统一标准,结束目前的混乱局面,W3C组织于19988月专门成立了SVG工作组致力于图形标准的制定工作,并于1999211日发布了第一个讨论草案,后几经修订于最近发布了最终草案。

SVG是一种基于XML的用来描述二维矢量图形和矢量/点阵混合图形的置标语言,其全称是可升级矢量图形规范(Scalable Vector Graphics)。其中,"可扩展"scalable)在图形图像技术上指的是它不局限于一个固定的分辨率和大小,譬如可以在不同分辨率的屏幕上以相同的大小显示,也可以在同一个网页中以不同的大小或观全局或观细节;而在网络技术上指的是这一规范能够与其它规范相融合,从而满足更广泛的用户需求,适合于更广泛的应用方式。"矢量"vector)是指规范中描述了直线、曲线、形状等几何图形,而无须象PNGJPEG等图像格式那样逐象素进行描述,这使得集成了SVGXML文档更小,下载速度也大大提高。"图形"graphics)是指它提供了对矢量和矢量/栅格混合图形的描述,填补了大多数基于 XML的置标语言规范对复杂图形描述的空白。

SVG规范定义了SVG的特征、语法和显示效果,包括模块化的XML命名空间(namespace)和SVG文档对象模型(DOM)。在以前的草案中,仅为SVG定义了一个DTD,这个DTD支持样式单的引用。但这样一来,SVG 就不再是一个自定义的全包容的语言规范,而需要浏览工具额外具有对样式单文件的处理能力。出于这种考虑,在新近出台的SVG的第八个草案中,为SVG提供了两种不同的形式,即样式化SVG和交换型SVG,它们各自有不同的DTDMIME类型。样式化SVG允许对图形对象进行样式添加,它可以通过引用外部样式文件、在文件头中预先进行样式声明和通过属性为元素定义样式三种方式使用样式单,是SVG用于网络环境的推荐存储格式。而交换型SVG取消了对样式单的支持,完全使用元素属性描述各个图形对象的显示效果。在未来的网络传输中,交换型SVG将会充当现在印刷业广泛使用的图形格式--EPS格式的网络版。并且,由于所有显示信息都封装到XML的属性中,交换型SVG还可以作为XSLT转换后所得到的结果文件格式,广泛应用于XML文档显示效果的描述中。

 4.2 Mobile上的svg

J2MEJava 2技术架构内三大重要分支之一,其目的在提供诸如手机、PDA等消费性电子产品或嵌入式系统开发应用程式的平台。简单来说,只要手机厂商在其作业平台上提供可以执行J2MEJAVA虚拟机器(KVM),则利用J2ME所开发出来的应用程式便能在该手机上直接执行。J2ME最主要的用意是希望能把手机厂商与软体厂商连结起来,弥补在消费性电子产品或嵌入式系统上开发应用程式的缺口。由于现阶段手机大厂皆采纳了J2ME平台,包括NokiaMotorolaSony EricssonSiemens等,因此在支持J2ME平台的手机逐渐普及之下,软体厂商也顺理成章的提高了在手机上开发应用程式的意愿。
  有鉴于此,负责制订Java Profile规格的JCP组织,也于2004年公布了一个可于行动平台上绘制2D矢量图形功能的套件(Package)-Scalable 2D Vector Graphics API。因其JSR(Java Specification Request)标号订为226,故我们JSR 226称之。JSR 226是由Nokia这家手机大厂主导制订的,其他的专家群(Expert Group)成员包括SonyEricssonMotorolaSiemensSun MicrosystemsTinyLineIBMTexas InstrumentsSymbian...等等。
  在J2ME开发环境上,JSR 226规格定义了可缩放2D矢量图形的应用程式界面,并且必须支持SVG Tiny Profile,并相容于SVG-T 1.1。其执行平台和OpenVG相差不多,皆适用于记忆体容量、屏幕大小及计算效能有限的行动装置上。但有别于OpenVG规格的是,JSR 226是一套较为高阶的矢量绘图标准。此规格提供了可用来绘制Scalable 2D vector imagesAPI套件,其中包含了SVG格式的影像档。
  由于JSR 226必须支持SVG Tiny Profile特性的关係,JSR 226应该具备具有延伸机制的能力。随着SVG profiles未来可能的发展,才能达到完全支持的效果。此外,JSR 226若能透过OpenVG函式库来加以实作,并且充分利用矢量图形硬体加速的功能,对于JSR 226效能的展现绝对有正面的助益。最后说明JSR 226这套程式界面的应用,主要项目包括地图视觉化、可缩放的图示(icon)、及其他必须符合自由缩放需求的进阶应用。

4.3 RIM上的svg

借助于SVG实现九宫格布局,我们对UI的设计和修改就非常方便。我们这部分SVG的例子,希望达到的效果是使用SVG原始文件来布局我们的九宫格UI,同时,应用RIMJSR226的支持,来对用户界面事件做出响应。通过这个方式,我们可以熟悉和了解在BlackBerry应用SVG开发的过程和方法。

根据最新的BlackBerryBrowser技术规范,svgtiny1.2已经在BlackBerry上得到了支持。所以BlackBerrySVG的开发的支持通过HTML方式集成,也可以采用Java本地应用的方式来集成。

步骤一

编辑原始SVG文件

由于SVG文件是一种基于XML格式的标签文件,所以也有很多基于XML编辑风格的工具来编辑原始SVG文件。一种选择是Adobesvgview,也有一个中国人开发的工具,叫SVGDeveloper

对于SVG的编辑,我们可以用BlackBerry的自己的选择Plazmic Composer for BlackBerry Smartphones。这个工具本身是用来作为BlackBerry上的主题和动画制作的工具。但是它也可以用来对SVG文件编辑。

在第6章,我们也会介绍用这个工具来进行BlackBerry上的主题和动画制作。

在这里就以SVGDeveloper为例,说明一个基本的SVG文件的编辑已经构成开发过程,关于SVGDevelper的使用和安装下载,可以参考SVGDevelper的官方网站。下面我们使用SVGDeveloper编辑一个sample.svg文件

 

对于生成的sample.svg的源文件,如果打开,可以看到如下内容,我们分别解释如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?>

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd">

<svg width="480" height="360" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

上面的是SVG源文件,也就是XML文件的文件头,描述了SVG的版本和xml的版本信息

                <image id="menuimg1" x="75" y="59" width="81" height="58" xlink:href="title0_png_1_img_1_1.png" transform="matrix(0.9999999,0,0,0.52,-33.00167,-9.760333)" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" />

      <!— image 2 to 8 -->

                <image id="menuimg9" x="383" y="278" width="107" height="55" xlink:href="title8_png_10_img_1_1.png" transform="matrix(1,0,0,1,-46,-40)" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" />

上面的时xml文件中的image部分,也就是我们在svg文件中引入图标文件的内容。菜单图标28被省略掉了

      <text x="77" y="129" space="preserve" font-family="Tahoma" font-size="12" fill="#000000" stroke="none" stroke-opacity="0" transform="matrix(2.49,0,-0.067,0.9999999,-142.674,-52.00032)" xmlns="http://www.w3.org/2000/svg">

                menu1</text>

                      <!— munu text 2 to 8 -->

                <text x="77" y="129" space="preserve" font-family="Tahoma" font-size="12" fill="#000000" stroke="none" stroke-opacity="0" transform="matrix(2.49,0,-0.06700001,0.9999999,165.3164,175.9896)" xmlns="http://www.w3.org/2000/svg">

                menu9</text>

上面的时xml文件中的菜单项的文字描述部分,也就是我们在svg文件中引入菜单描述的内容。菜单文字28被省略掉了。

<line id="menuline1" idx1="19" y1="77" x2="129" y2="77" stroke="#0099CC" stroke-opacity="1" transform="matrix(0.6129999,0,0,0.9999999,44.97239,137.9971)" opacity="1" stroke-width="4" xmlns="http://www.w3.org/2000/svg" />

                      <!— mune underline 2 to 8 -->

<line id="menuline9" idx1="19" y1="77" x2="129" y2="77" stroke="#0099CC" stroke-opacity="1" transform="matrix(0.6129999,0,0,0.9999999,187.9734,138.9976)" opacity="1" stroke-width="4" xmlns="http://www.w3.org/2000/svg" />

</svg>

上面的是xml文件中的菜单项下面的高亮的下划线部分,也就是我们在svg文件中引入菜单突出的内容。下划线28被省略掉了。

步骤二

对于SVG的原始文件的操作,我们可以直接选择基于浏览器上操作,比如DOMJavascript方式,通过Widget技术或者浏览器应用直接操作。还有一种选择是使用J2ME API来对SVG文件进行操作。在本文中,我们选择使用J2ME API来对SVG原始文件进行操作,达到的效果是,当用户选择中SVG图标是,响应的图标会出现。

建立Java应用,添加一个基本的基于canvas应用的的java文件中,这个应用需要考虑如下内容:

由于我们是一个九宫格的UI应用程序,需要考虑的就是对用户键盘输入的响应,这里有两种方式可以响应获取到键盘或者滚轮之类的手机用户输入时间,一种方式是通过canvas的响应接口,正如前面几种UI设计的方法中应用的那样。另外一种方式是通过SVG 元素本身提供实现的事件响应接口来捕获获取用户输入事件。

org.w3c.dom.events取用户输入事件提供的事件类型包括如下几种类型

click 点击

DOMActivate click类似

DOMFocusIn 获取焦点

DOMFocusOut 焦点移出

相应的处理示例逻辑如下所示

EventListener listen1 = new MyEventListener();

// Listen to click events, during the bubbling phase

SVGElement myRect = (SVGElement)document.getElementById();

myRect.addEventListener("click", listen1, false);

由于本例中item的个数比较多,就不一一实现这样的方法了,采用canvas获取滚轮移动然后动态显示下划线的方式就可以了。在地5章,我们会继续讨论dom事件响应的编程方法。

JSR226基于SVG的开发过程中,需要引入的主要的包括如下几个:

import javax.microedition.m2g.*;

import org.w3c.dom.*;

import org.w3c.dom.svg.*;

正如名字所示,这几个package的具体作用就不详述了。SVG的元素可以应用到MIDP的高级UI组件上,也可以应用到MIDP的低级UI组件上。这里我们还是以Canvas为例说明SVGBlackBerryUI上的使用。

class MySVGCanvas extends Canvas

{

       

    private SVGImage _image;

    private ScalableGraphics _sg;

 

    MySVGCanvas(SVGImage image) throws IOException

    {   

        _image = image;

        _sg = ScalableGraphics.createInstance();

    }

 

    public void paint(Graphics g)

    {

        if( _image  == null )

        {

            return;

        }

               

        // Bind target Graphics target to render to.

        _sg.bindTarget(g);

         Document document = _image.getDocument();

        For (int i=1; i<=9;i++)

       {
           SVGElement menuline = (SVGElement) document.getElementById(“menuline” + i);

           if (i == focus)
           menuline. setTrait ("visibility",”visible”);

     else

        menuline. setTrait ("visibility",”hidden”);

}

       

        // Set our viewport dimensions.

        _image.setViewportWidth(_canvasWidth);

        _image.setViewportHeight(_canvasHeight);

        // Render the svg image (model) and x/y=0/0

        _sg.render(0, 0, _image); 

        // Release bindings on Graphics     

        _sg.releaseTarget();

}

 

public void keyPressed(int key) {

                                int action = getKeyAction(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();

                }

}

midlet主程序中加入如下初始化逻辑

            private static final String SVG_URL = "/sample.svg";

            SVGImage image = loadSVGImage(SVG_URL);       

            Canvas canvas = new MySVGCanvas(image);

步骤三

编译打包,把Java工程生成相应的cod文件,下载到真机或者模拟器上,可以观察到我们的SVG技术base的九宫格程序的UI效果了。

SVGDeveloper License Agreement SVGDeveloper 1.0.5 Copyright(C)2003-2005 PerfectSVG.com All rights reserved Email: service@perfectsvg.com MSN: service@perfectsvg.com WWW: http://www.perfectsvg.com No Warranty SVGDeveloper is sold "as is" and without any warranty as to merchantability or fitness for a particular purpose or any other warranties either expressed or implied. The author will not be liable for data loss, damages, loss of profits or any other kind of loss while using or misusing this software. Evaluation and Registration SVGDeveloper is not free software. You may use this software for evaluation purposes without charge for a period of 30 days. If you use this software after the 30 day evaluation period, you must pay registration fee. Distribution of the evaluation version You may copy the evaluation version of this software and documentation as you wish, and give exact copies of the original evaluation version to anyone, and distribute the evaluation version of the software and documentation in its unmodified form via electronic means. But you should not charge or requesting donations for any such copies however made and from distributing the software and/or documentation with other products without the author's written permission. Registered version One registered copy of SVGDeveloper may either be used by a single person who uses the software personally on one or more computers, or installed on a single workstation used non-simultaneously by multiple people, but not both. You may access the registered version of SVGDeveloper through a network, provided that you have obtained individual licenses for the software covering all workstations that will access the software through the network. Copyright(C)2003-2005 PerfectSVG.com All rights reserved
SVGDeveloper是一款功能强大的SVG格式编辑器,利用SVGDeveloper功能强大的绘制功能,你可以绘制诸如圆形、矩形、星形等基本形状,也可以绘制文本、图像和自由曲线等复杂图形。同时,SVGDeveloper还提供了其他一些高级功能使得你更加容易的创建和管理SVG程序。强大的代码编辑器,集成了语法着色和智能语法提示功能,使得你可以编写复杂的脚本程序,从而可创建更加复杂的SVG应用。 SVGDeveloper功能介绍 绘制各种高质量的SVG矢量图形,提供包括矩形、椭圆、圆、直线、折线、多边形等在内的基本形状构造。 支持任意形状的路径构造(贝赛尔曲线)。 支持文本构造。 支持栅格图像和SVG图像的导入。 按照命名空间和对象类型批量删除对象 转换图像为base64代码 支持线性渐变、辐射渐变和图案渲染。 基于时间线,创作包括变换、属性、运动、形状、声音、遮罩等在内的各种形式动画,同时可将动画绑定到事件; 可视化地编辑渐变、图案并生成相关动画; 图形对象的成组和解组以及层次调整功能; 语法自动加亮的代码编写机制,方便您书写SVG代码; 智能语法提示 智能化的事件创作机制,允许您通过列表式生成对象事件并自动定位到javascript代码。 打印支持 更强大的外部图图元支持 XAML支持(支持导出和语法提示) 颜色主题支持,可以定制个性化的开发环境 打印支持 SVGDeveloper截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值