博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义Background
阅读量:6421 次
发布时间:2019-06-23

本文共 2604 字,大约阅读时间需要 8 分钟。

hot3.png

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;    }}

 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_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}

如果你觉得这些属性不够用,完全可以加入自定义属性(比如旋转角度),然后在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://my.oschina.net/monolog/blog/404813

你可能感兴趣的文章
javaweb学习总结(二十四)——jsp传统标签开发
查看>>
让script的type属性等于text/html
查看>>
linux 文件系统sysvinit 流程分析
查看>>
体素科技:2018年,算法驱动下的医学影像分析进展
查看>>
Vue 折腾记 - (8) 写一个挺靠谱的多地区选择组件
查看>>
VS Code折腾记 - (3) 多图解VSCode基础功能
查看>>
『翻译』Node.js 调试
查看>>
我的iOS开发之路总结(更新啦~)
查看>>
Java NIO之拥抱Path和Files
查看>>
微信原图泄露的只能是 Exif ,你的隐私不在这!!!
查看>>
微信小程序教学第三章(含视频):小程序中级实战教程:列表篇-页面逻辑处理...
查看>>
页面间通信与数据共享解决方案简析
查看>>
Swift 中 Substrings 与 String
查看>>
作为一个开源软件的作者是一种什么样的感受?
查看>>
移动端适配知识你到底知多少
查看>>
TiDB 在 G7 的实践和未来
查看>>
重新认识javascript对象(三)——原型及原型链
查看>>
小学生学“数学”
查看>>
【Vue】组件使用之参数校验
查看>>
FastDFS蛋疼的集群和负载均衡(十七)之解决LVS+Keepalived遇到的问题
查看>>