<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    TWaver - 專注UI技術

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

    自定義Background

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

     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進行繪制,具體代碼請看附件
     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結構如下:

     1 public class GeneralBackGroundLayer {
     2     private int direction=DIRECTION_TOP_LEFT;//位置,默認左上角
     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 }

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

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

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

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


    網站導航:
     
    主站蜘蛛池模板: 国产精品无码一区二区三区免费| 亚洲熟女一区二区三区| 日木av无码专区亚洲av毛片| 亚洲一级毛片在线观| 在线免费观看国产| 亚洲精品456播放| 久久精品国产亚洲av麻豆蜜芽| 亚洲一级免费视频| 亚洲乱码一二三四区麻豆| 久久福利资源网站免费看| 亚洲一级毛片免观看| 成年性生交大片免费看| 亚洲av色香蕉一区二区三区| 久久久久国产精品免费网站| 麻豆亚洲AV永久无码精品久久 | 精品亚洲成α人无码成α在线观看| 人成电影网在线观看免费| 亚洲小说区图片区另类春色| 人妻免费一区二区三区最新| 亚洲国产成人精品无码久久久久久综合| 亚洲日韩乱码中文无码蜜桃臀| 丝袜足液精子免费视频| 亚洲精品亚洲人成人网| 国产JIZZ中国JIZZ免费看| 国产jizzjizz视频免费看 | 亚洲va精品中文字幕| 日韩免费观看的一级毛片| 人成电影网在线观看免费| 亚洲αv久久久噜噜噜噜噜| 麻豆一区二区免费播放网站| 亚洲av成人一区二区三区在线播放| 亚洲日本在线观看视频| 99精品视频免费观看| 国产精品亚洲专区无码牛牛| 久久亚洲AV永久无码精品| 亚洲精品视频在线观看免费| 久久精品亚洲一区二区三区浴池| 毛片A级毛片免费播放| 巨胸狂喷奶水视频www网站免费| 亚洲国产成人无码av在线播放| 亚洲AV无码乱码在线观看牲色|