TWaver - 专注UI技术

http://twaver.servasoft.com/
posts - 171, comments - 191, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

自定义Background

Posted on 2012-08-17 11:00 TWaver 阅读(1420) 评论(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哦!附件下载请见原文最下方

只有注册用户登录后才能发表评论。


网站导航: