TWaver - 專注UI技術(shù)

          http://twaver.servasoft.com/
          posts - 171, comments - 191, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          自定義Background

          Posted on 2012-08-17 11:00 TWaver 閱讀(1436) 評論(0)  編輯  收藏
          TWaver提供了ImageBackground來為TNetwork設(shè)置背景,ImageBackground可以設(shè)置為顏色,漸變色,圖片或紋理,但是如果想設(shè)置多張圖片為背景,或者需要準(zhǔn)確的定位背景(比如居中),ImageBackground就無能為力了,下面看我的解決方案:
          既然ImageBackground無法滿足需求了,我們就自己寫一個,得益于TWaver優(yōu)秀的設(shè)計,我們可以很容易地擴(kuò)展原有的類,然后加上自己的功能。通過查看API得知,ImageBackground繼承自AbstractBackground,我們干脆拋棄ImageBackground,自己從AbstractBackground繼承。考慮到有可能需要多張圖片組合成一個背景,我們引入Layer的概念,在我們自定義的Background維護(hù)一個集合,存儲Layer的信息,繪制背景的時候從集合中取出Layer統(tǒng)一渲染。自定義Background類的結(jié)構(gòu)應(yīng)該是下面這樣的:

           1 public class GeneralBackGround extends AbstractBackground{
           2     private java.util.List backGroundModel=new ArrayList();
           3     @Override
           4     public void paintContent(Graphics2D g2d, double zoom, Rectangle viewportRect) {
           5         Iterator it=backGroundModel.iterator();
           6         while(it.hasNext()){
           7             GeneralBackGroundLayer gbgd= (GeneralBackGroundLayer) it.next();
           8             //利用g2d進(jìn)行繪制,具體代碼請看附件
           9         }
          10     }
          11     /**
          12      * 添加Layer
          13      * @param layer
          14      */
          15     public void addLayer(GeneralBackGroundLayer layer){
          16         this.backGroundModel.add(layer);
          17     }
          18     @Override
          19     public Dimension getBackgroundSize() {
          20         return null;
          21     }
          22     @Override
          23     public SVGStruct toSVG(SVGContext svgContext) {
          24         return new SVGStruct("", null);
          25     }
          26     public List getBackGroundModel() {
          27         return backGroundModel;
          28     }
          29     public void setBackGroundModel(List backGroundModel) {
          30         this.backGroundModel = backGroundModel;
          31     }
          32 }

          Layer更簡單,因為渲染工作是GeneralBackGround來做,所以Layer只需要存儲一些背景屬性,比如:位置,類型(顏色,漸變,圖片,紋理),透明度等,我定義的Layer結(jié)構(gòu)如下:

           1 public class GeneralBackGroundLayer {
           2     private int direction=DIRECTION_TOP_LEFT;//位置,默認(rèn)左上角
           3     private int type;//類型,顏色,漸變,圖片或紋理
           4     private boolean full=false;//是否填充整個背景
           5     private Dimension size;//指定大小
           6     private Color color;//背景色
           7     private Color gradientColor;//漸變背景色
           8     private int gradientFactory;//漸變樣式,屬性為TWaverConst.GRADIENT_XXX
           9     private int offsetX=0;//X偏移
          10     private int offsetY=0;//Y偏移
          11     private SerializableTexturePaint texturePaint;//紋理背景
          12     private SerializableImage image;//背景圖片
          13     private String name;//層的名字
          14     //不會序列化的圖片和紋理背景
          15     private Image unserializableImage;
          16     private TexturePaint unserializableTexturePaint;
          17     private float alpha=1f;//透明度
          18 
          19     //getter,setter
          20 }

          如果你覺得這些屬性不夠用,完全可以加入自定義屬性(比如旋轉(zhuǎn)角度),然后在GeneralBackGround#paintContent中處理一下就可以了。

          接下來要考慮XML存儲的問題,TWaver使用java.beans.XMLEncoder將java bean轉(zhuǎn)換成XML,具體的用法可以查看API。需要指出的是,BufferedImage和TexturePaint無法直接轉(zhuǎn)換,因為它們沒有公共的無參構(gòu)造,為了將它們存儲進(jìn)XML,我們需要做一點額外的處理:BufferedImage轉(zhuǎn)換成Base64的一個字符串存儲,TexturePaint可以拆成一個BufferedImage和一個Rectangle存儲,我的實現(xiàn)類分別是:SerializableImage和SerializableTexturePaint,源碼在附件中,大家可以參考。
          最后附上一張Demo截圖

          注意,除了兩個Node和一個Link,其它的都是Background哦!附件下載請見原文最下方

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 成安县| 渭源县| 济宁市| 尼勒克县| 万州区| 古蔺县| 宿松县| 阜康市| 三门峡市| 马龙县| 潼关县| 仙桃市| 措勤县| 祁门县| 进贤县| 仁化县| 资源县| 绥阳县| 平乐县| 永春县| 西峡县| 晋中市| 高雄市| 静海县| 双桥区| 东阳市| 木里| 武威市| 仙游县| 竹北市| 威海市| 哈巴河县| 长葛市| 读书| 潢川县| 佛冈县| 库尔勒市| 稷山县| 长岛县| 宁津县| 西乡县|