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(); @Override public 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); } @Override public Dimension getBackgroundSize() { return null; } @Override public SVGStruct toSVG(SVGContext svgContext) { return new SVGStruct("", null); } public List getBackGroundModel() { return backGroundModel; } public void setBackGroundModel(List backGroundModel) { this.backGroundModel = backGroundModel; } }
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_XXX private 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 }