国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

J2ME移動 2D 圖形開發快速入門

2019-11-18 15:53:51
字體:
來源:轉載
供稿:網友

   一、摘要

  這篇文章將介紹可升級2D矢量圖形API (Scalable 2D Vector Graphics API),它是J2ME的一個可選包。這些API非常易于使用,它們可以用來渲染和轉換體積小和伸縮性好的二維(2D)圖形,這個可選包在java社區進程(JCP)中以JSR-226開發。我將會給出API的總括,并且突出典型的用戶案例,使用代碼演示這些案例。

   二、慨述

  JSR-226將渲染和重放矢量2D圖形引入到Java語言的移動應用中。由Nokia領導的專家組,是由移動行業的主要廠商組成,他們都很有愛好將矢量多媒體內容引入到他們的設備中。在寫這篇文章時,這個規范剛剛被核準,大家正在熱切期待著一個參考實現。

  矢量圖對移動開發者來說,有兩大好處:占用空間小和伸縮性好。考慮下面這個簡單的圖像:

一個簡單的示例圖像
J2ME移動 2D 圖形開發快速入門(圖一)
圖1 一個簡單的示例圖像

  使用GIF格式,這個圖片的大小會達到7386字節。使用向量格式,大小僅僅為693字節,不到十分之一。這種減少是如何發生的呢?

  以光柵為基礎的圖像格式,像GIF,對組成圖像的矩形區域中的每一個像素的色彩內容進行編碼。而矢量圖,僅僅包含決定像素應該如何被著色的繪畫指令。一個圖像的向量表示法可以更大程度上進行壓縮,這對資源受限的移動設備是一個很大的有利因素。

  伸縮性好是另外一個重要的優點。矢量圖可以很清楚的進行變換,因為它們的繪畫指令是和分辨率無關的。圖2顯示前一張圖片進行等比例縮小、翻轉和旋轉后的圖像。

示例圖片的變換
J2ME移動 2D 圖形開發快速入門(圖二)
圖2 示例圖片的變換

  矢量圖的度量單位是任意的和相對的,它們可以被一些常量因子乘或除,以變換圖像從而適應特定設備的屏幕。通過對這個坐標系統使用簡單的數學操作,你可以創造出無限的效果,包括翻轉、旋轉、拉伸和扭曲。使用矢量圖像,應用程序開發者不再需要為圖像和圖標創建不同的集合,來支持不同的屏幕分辨率。

  矢量圖的簡潔和伸縮性在動畫領域大放異彩。以光柵為基礎的動畫,像網頁中的GIF和MIDP游戲中的精靈,在動畫的每一個幀中包含整個圖片都很費力。與之相比,以矢量為基礎的動畫僅僅包含一些指令,而這些指令規定了當需要改變動畫時的圖像哪些元素應該如何改變。假如矢量圖的大小比它們相對應的光柵圖小一個數量級,那么矢量動畫的大小就比他們相對應的光柵動畫小兩個數量級,這使得它們成為在移動設備上變換和展示多媒體內容的理想選擇。

  當以私有的Macromedia Flash播放器為基礎的矢量圖和矢量動畫變得流行時,可升級矢量圖形(Scalable Vector Graphics,SVG)文件格式以開放的標準和免費的專利權,成為業界的另外一個選擇。它由W3C標準化。SVG-Tiny提供了SVG全部功能的一個子集,適合在移動設備上使用。JSR-226采用SVG-Tiny的1.1版本作為J2ME矢量圖形的官方文件格式。W3C稱SVG-Tiny為一個“PRofile”,但是為了避免和J2ME的Profile混淆,我稱之為“格式”。

  SVG-Tiny標準也可以支持動畫。圖像文件內部的指令可以自己修改圖像元素的位置和屬性,往返應時鐘事件和用戶輸入。

  為了更加復雜的交互,JSR-226引入了兼容microDOM的API,microDOM是SVG1.2完整的文檔對象模型(DOM)的一個子集。

  SVG是一種可擴展標記語言(xml)格式,它使用一個公共的Schema充分的注釋和系統化。SVG-Tiny可能很小,但是它們仍然是SVG文件,仍然包含XML。下面是代表一個“brave world”圖像的完整的SVG-Tiny文件:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN"
    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
<svg preserveaspectRatio="xMidYMid meet"
        viewbox="10 10 130 55" width="150.0" height="75.0">
    <rect x="25" y="25" transform="translate(75 36.375)
        rotate(15) translate(-70 -35.375)" fill="#00007E"
        width="100" height="22.75" stroke="#000000" stroke-width=".5"/>
    <rect x="25" y="25" fill="#FF9800" width="108.5"
        height="22.75" stroke="#000000" stroke-width=".5"/>
    <text x="30" y="40" fill="#00007E" stroke="#FFFFFF"
        stroke-width=".33" xml:space="preserve">Hello brave world.</text>
</svg>

  這個文檔聲明了兩個矩形和一些文字。第一個矩形繞它的中心旋轉15度,這一系列的轉換都包含在rect標記的轉換屬性中。第二個矩形在第一個之上繪制,然后文本在第二個矩形之上繪制。

  即時未經修飾的文本不是一個非凡的簡潔格式,這個文檔仍然比一個壓縮的光柵圖像小的多,并且易于人工導入。因為XML文本可以充分地壓縮,所以SVG在應用程序的JAR文件中就占用相對較少的空間。JSR-226要求支持SVG文檔的實現使用gzip格式壓縮。后綴名.svgz表示gzip壓縮的文檔。

   三、Mobile 2D API

  JSR-226的一個主要的目的就是定義移動2D圖形(Mobile 2D Graphics,M2G)API,這個API是一小組和SVG-Tiny格式功能結合很緊密的類。它沒有被規定為普通的2D圖形繪制工具箱,就像 J2SE的Graphics2D類提供的那樣。M2G API很清楚地定位于播放和在運行期操縱SVG內容。

  M2G由高級類和低級類組成,高級類用來創建和渲染矢量圖形,而低級類負責以DOM樹的部分來操縱一個矢量圖形的XML成分。矢量圖形是ScalableImage的實例,你可以通過這個的靜態createImage()方法獲得它們。你使用ScalableGraphics的一個實例將ScalableImages繪制到一個 MIDP圖形上下文中。SVGImage是ScalableImage的一個子類,它提供事件處理和底層DOM文檔訪問之間的聯系。

  為了使渲染動畫SVG內容的普通情況更加方便,這個API提供了SVGAnimator類。對MIDP應用程序,SVGAnimator創建和控制一個 Canvas對象,這個對象自動處理屏幕更新,以回應動畫事件和對這個圖像的計劃性的修改。SVGAnimator提供一個類似播放器接口來控制動畫的播放。

  這些類都定義在javax.miroedition.m2g和org.w3c.dom.svg包中,在表1中進行了總結,并且在 JSR-226規范中也作了充分的注釋。SVG DOM是在標準的org.w3c.domorg.w3c.dom.events包中定義DOM類和接口的擴展。

Class或Interface            描述
javax.microediton.m2g
ScalableGraphics          2D渲染的基礎類
SVGAnimator          這個類對一個目標用戶接口組件,處理SVGImage的更新和動畫的自動渲染
SVGEventListener          這個接口用來處理一個應用程序的平臺相關事件
SVGImage          這個類代表符合W3C SVG Tiny1.1 Profile的SVG圖像
ExternalResourceHandler          這個接口用來同步加載裝入SVG內容所需要的外部資源
org.w3c.dom.svg
SVGAnimatorElement          這個接口代表一個動畫元素,包含控制動畫時間的方法
SVGElement          這個接口代表文檔樹中一個SVG元素
SVGLocatableElement          這個接口代表一個可繪制的SVG元素,典型的有外形、圖像或者文本
SVGMatrix          這個接口代表一個SVG matrix數據類型,由一個仿射矩陣定義,等價于一個平移的線性變換
SVGPath          這個接口代表一個SVG path數據類型,用來定義幾何路徑
SVGPoint          這個接口代表一個SVG point數據類型,由它的x和y標示
SVGRect          這個接口代表SVG rectangle數據類型,由最小X、最小Y、寬度和高度組成
SVGRGBColor          這個接口代表SVG RGB color數據類型,由紅、綠、藍組成
SVGSVGElement          這個接口代表在SVG文檔樹中的一個元素

  四、創建M2G應用程序

  為了創建一個M2G應用程序,你需要可以工作的JSR-226實現。在寫這篇文章時,這個規范才剛剛被定案;沒有設備實現它,并且沒有官方的參考實現可用。你可以下載一個有限的、實現的實現,作為mpowerplayer開發者工具箱的附加包。

  你還需要一些SVG-Tiny內容。這篇文章是用上面的“brave world”圖像,但是更多的SVG-Tiny示例可以從移動開發工具制造者TinyLine上獲得。你也可以使用一個商用Java應用程序創建自己的內容,這個應用程序被稱為Sketsa,它可以像一個插圖工具一樣工作,并且使用SVG作為它的文件格式。

  只有很少的方法用來將你的 SVG內容繪制到屏幕上。最簡單的是為你的圖像創建一個SVGAnimator,然后把它Canvas放到屏幕上。另外一個方法是創建一個 ScalableImage的實例,然后使用ScalableGraphics的實例將它繪制到你自己的Canvas或者CustomItem的圖形上下文中。你將會獲得除了展現外的更多控制,但是你必須負責處理輸入事件,并且為動畫效果或者用戶交互進行重繪。

   五、使用一個SVGAnimator顯示2D圖像

  你可以通過SVGAnimator的靜態方法createAnimator()獲得一個它的實例,需要提供你自己的圖像。使用SVGAnimator是一個不錯的選擇,因為它處理所有的用戶交互,和動態內容的動畫。play()、pause()、stop()和setTimeIncrement()方法會給你除了重放之外的對動畫的可編程控制。實現可能提供一個本地用戶接口,可以同樣的處理動態行為。

  一旦你獲得SVGAnimator,就可以很輕易的將它嵌入到你的應用程序中。調用getTargetComponent()會一個Canvas實例,它可以被放置在屏幕上。下面是一個例子:

public void animationTest()
    {
        // create an animator to load the content
        SVGAnimator animator =
   SVGAnimator.createAnimator( image );
          
        // add our custom event listener
        animator.setEventListener(
   new CustomEventListener( animator ) );
      
        // get the Canvas for this player; requires a cast
        Canvas canvas = (Canvas) animator.getTargetComponent();
      
        // add a "back" command
        canvas.addCommand( backCommand );
        canvas.setCommandListener( this );
      
        // show it
        Display.getDisplay(this).setCurrent( canvas );
      
        // start it
        animator.play();
    }

  在MIDP環境中,從getTargetComponent()返回的值是一個MIDP Canvas。在非MIDP環境中,返回值將適合本地窗口系統,例如在AWT環境中,返回值是Component。假如當前環境擁有一個以上的可用的選擇,那么就提供需要的類型的名字作為createAnimator()的第二個參數。

  圖3顯示了運行時結果。根據不同的實現,和筆觸設備的可用性,動畫繪制器可能答應用戶和動畫內容進行交互。在“brave world”例子中沒有動態的內容,但是文本是可選的。

由SVGAnimator控制的Canvas
J2ME移動 2D 圖形開發快速入門(圖三)
圖3 由SVGAnimator控制的Canvas

   六、和動畫繪制器交互

  盡管“brave world”圖像不是一個動畫,一些程序設計還是可以增加交互的。

  JSR-226的DOM支持一個程序改變一個圖像的結構。和任何其他的XML文檔一樣,一個SVGImage可以用一個DOM對象樹代表。M2G API答應你使用類似熟悉的XML處理技術來修改圖像。樹中的每一個節點是一個SVGElement,提供操縱臨近的父節點和子節點的方法。你可以通過添加和刪除子節點修改節點,或者轉換成一個合適的元素類,然后調用那個類的方法進行改變。

  SVGEventListener結構使你的應用程序可以從SVGAnimator的Canvas接收用戶的輸入事件。這個例子是用DOM API來等比例變化和旋轉這個圖像,用戶可以通過箭頭鍵輸入:

{
    int gameAction = canvas.getGameAction( keyCode );
    switch ( gameAction )
    {
        case Canvas.UP:
            scale( 0.10f );
            break;
        case Canvas.LEFT:
            rotate( -10.0f );
            break;
        case Canvas.DOWN:
            scale( -0.10f );
            break;
        case Canvas.RIGHT:
            rotate( 10 );
            break;
        default:
            // leave unchanged
    }
}

private void rotate( final float delta )
{
    // put ourselves on the animator's thread
    animator.invokeLater( new Runnable()
    {
        public void run()
        {
            // execute the transformation
            Document document = svgImage.getDocument();
            SVGSVGElement root = (SVGSVGElement)
    document.getDocumentElement();
            root.setCurrentRotate( root.getCurrentRotate() + delta );
        }
    } );
}

private void scale( final float delta )
{
    // put ourselves on the animator's thread
    animator.invokeLater( new Runnable()
    {
        public void run()
        {
            // execute the transformation
            Document document = svgImage.getDocument();
            SVGSVGElement root = (SVGSVGElement)
    document.getDocumentElement();
            root.setCurrentScale( root.getCurrentScale() + delta );
        }
    } );
}

  SVGImage.getDocument()提供了動畫繪制器渲染的文檔的引用。因為這個播放器可能正在運行一個或者更新一個動態的內容,所以你必須小心地將你的變化和動畫線程同步,否則將會發生不可確定的錯誤。SVGAnimator's invokeAndWait() 和invokeLater()方法就像它們的AWT副本一樣,可以保證你的代碼在動畫線程上運行。

   七、直接渲染2D內容

  假如你想除了你的SVG圖像在哪里和怎樣被渲染外獲得完全的控制,你可以使用ScalableGraphics類直接繪制一個ScalableImage到Graphics對象之上,這個Graphics對象被傳遞到 Canvas、Layer或者CustomItem實例的paint()方法中。

  你通過調用ScalableGraphics的靜態 createInstance()方法創建一個它的實例。在繪制之前,你必須首先使用bindTarget()方法將ScalableGraphics實例和傳遞到繪制方法中的Graphics對象綁定。在完成以后,請調用releaseTarget()。一旦建立綁定,你就可以使用render()方法繪制你的每一個圖像。

  這個例子以不同的大小重復繪制“brave world”圖像,例子通過在每一次調用render()方法前調用setViewportHeight()和setViewportWidth()方法改變圖像大小:

private static class M2GCanvas extends Canvas
{
    // retain a reference the specified image
    ScalableImage scalableImage;
    
    // retain an instance of a scalable graphics
    ScalableGraphics scalableGraphics;
  
    public M2GCanvas( ScalableImage inImage )
    {
        scalableImage = inImage;

        // create the scalable graphics instance
        scalableGraphics = ScalableGraphics.createInstance();
    }

    public void paint( Graphics g )
    {
        // clear the display
        g.setColor( 255, 255, 255 );
        g.fillRect( 0, 0, getWidth(), getHeight() );
      
        // bind our scalable graphics to the given graphics
        scalableGraphics.bindTarget( g );

        // render at fixed position and size
        scalableImage.setViewportWidth( 50 );
        scalableImage.setViewportHeight( 75 );
        scalableGraphics.render( 5, 50, scalableImage );

        // again at different position and size
        scalableImage.setViewportWidth( 100 );
        scalableImage.setViewportHeight( 150 );
        scalableGraphics.render( 80, 5, scalableImage );

        // again at size that varies with the canvas size
        scalableImage.setViewportWidth( getWidth()-20 );
        scalableImage.setViewportHeight( getHeight()-20 );
        scalableGraphics.render( 0, 0, scalableImage );

        // release the graphics context
        scalableGraphics.releaseTarget();
    }
}

  Canvas的子類在不同的位置以不同的大小顯示這個圖像三次。在第三次,圖像填滿了這個畫布。在支持可重設屏幕大小的設備上,圖像可以適當的等比例變化。圖4顯示了畫布的效果。在這個實現中,較大的圖像在窗口大小被重置時等比例得到。

在一個Canvas上等比例變換ScalableImages
J2ME移動 2D 圖形開發快速入門(圖四)
圖4 在一個Canvas上等比例變換ScalableImages

  假如你正在渲染的圖像是動態的,你應該答應用戶和他們交互。當你不用SVGAnimator渲染時,你需要檢測用戶指針事件,得到圖像是否和在何處被點擊,然后在SVGImage上調用dispatchMouseEvent()方法,觸發腳本定義好的動作。對一個CustomItem,表單移動應該答應激活和焦點導航,通過圖像中的元素,分別使用SVGImage的activate() 和focusOn()方法。

  你的程序不僅僅可以操縱一個已經存在的SVGImage的DOM,也可以從頭建立一個圖像。SVGImage的靜態方法createEmptyImage()返回一個具有空文檔的圖像,這個文檔的架構可以有程序創建的代表外形和變換的SVGElement填充。這種可以和ScalableGraphics聯合使用,實現一個普通的2D繪制工具箱,但是正像我前面提到的那樣,這樣用法不是最初的意向,不推薦使用。

   八、總結

  J2ME的可升級2D矢量圖形API提供了渲染和操作以矢量為基礎的圖像和動畫的能力。矢量圖像的占用空間小和伸縮性好使得它天生的適合移動應用程序。JSR-226的移動2D圖形API使應用程序能夠使用MIDP和AWT工具箱創建、顯示和修改SVG內容。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 四会市| 澳门| 上饶县| 卫辉市| 手游| 尤溪县| 库尔勒市| 蓬安县| 兴业县| 富民县| 襄樊市| 十堰市| 措美县| 湘阴县| 班玛县| 洛宁县| 维西| 葫芦岛市| 张家川| 宁晋县| 临朐县| 松阳县| 会同县| 平顶山市| 东平县| 乐业县| 水城县| 清原| 赫章县| 江津市| 安福县| 姜堰市| 湘阴县| 彭阳县| 旬阳县| 乌兰浩特市| 彰化县| 彰化县| 绿春县| 罗田县| 茶陵县|