自定义Background
TWaver提供了ImageBackground來為TNetwork設置背景,ImageBackground可以設置為顏色,漸變色,圖片或紋理,但是如果想設置多張圖片為背景,或者需要準確的定位背景(比如居中),ImageBackground就無能為力了,下面看我的解決方案:
既然ImageBackground無法滿足需求了,我們就自己寫一個,得益于TWaver優秀的設計,我們可以很容易地擴展原有的類,然后加上自己的功能。通過查看API得知,ImageBackground繼承自AbstractBackground,我們干脆拋棄ImageBackground,自己從AbstractBackground繼承。考慮到有可能需要多張圖片組合成一個背景,我們引入Layer的概念,在我們自定義的Background維護一個集合,存儲Layer的信息,繪制背景的時候從集合中取出Layer統一渲染。自定義Background類的結構應該是下面這樣的:?
public class GeneralBackGround extends AbstractBackground{private java.util.List backGroundModel=new ArrayList();@Overridepublic void paintContent(Graphics2D g2d, double zoom, Rectangle viewportRect) {Iterator it=backGroundModel.iterator();while(it.hasNext()){GeneralBackGroundLayer gbgd= (GeneralBackGroundLayer) it.next();//利用g2d進行繪制,具體代碼請看附件}}/*** 添加Layer* @param layer*/public void addLayer(GeneralBackGroundLayer layer){this.backGroundModel.add(layer);}@Overridepublic Dimension getBackgroundSize() {return null;}@Overridepublic SVGStruct toSVG(SVGContext svgContext) {return new SVGStruct("", null);}public List getBackGroundModel() {return backGroundModel;}public void setBackGroundModel(List backGroundModel) {this.backGroundModel = backGroundModel;} }?Layer更簡單,因為渲染工作是GeneralBackGround來做,所以Layer只需要存儲一些背景屬性,比如:位置,類型(顏色,漸變,圖片,紋理),透明度等,我定義的Layer結構如下:
?
public class GeneralBackGroundLayer {private int direction=DIRECTION_TOP_LEFT;//位置,默認左上角private int type;//類型,顏色,漸變,圖片或紋理private boolean full=false;//是否填充整個背景private Dimension size;//指定大小private Color color;//背景色private Color gradientColor;//漸變背景色private int gradientFactory;//漸變樣式,屬性為TWaverConst.GRADIENT_XXXprivate int offsetX=0;//X偏移private int offsetY=0;//Y偏移private SerializableTexturePaint texturePaint;//紋理背景private SerializableImage image;//背景圖片private String name;//層的名字//不會序列化的圖片和紋理背景private Image unserializableImage;private TexturePaint unserializableTexturePaint;private float alpha=1f;//透明度//getter,setter }如果你覺得這些屬性不夠用,完全可以加入自定義屬性(比如旋轉角度),然后在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哦!附件下載請見原文最下方
轉載于:https://www.cnblogs.com/twaver/archive/2012/08/17/2643947.html
總結
以上是生活随笔為你收集整理的自定义Background的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hack Into Linux Pack
- 下一篇: 64位Linux下使用QQ