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相关推荐

  1. typescript语法高亮插件_vscode常用插件

    插件介绍 HTML Snippets > 初级H5代码片段及提示 HTML CSS Support > 初级H5代码片段及提示 Debugger for Chrome > 让 vsc ...

  2. github pages + Hexo + 域名绑定搭建个人博客增强版

    概述 前面我们用github pages + Hexo 搭建了一个简单版的个人博客系统,但是里面的内容单调,很多功能不够完善,所以我们需要对yelle 的主题进行优化和完善.基本搭建请访问:http: ...

  3. Hexo-Theme-Buer主题修改介绍

    关于这个博客主题 Hexo-Theme-Buer使用 作者的个人网站: 不二博客 随着hexo的版本升级,同时我也想重构我的旧版博客主题,因此在这个月对博客进行了重构加改版,这个仓库存放我的新博客,并 ...

  4. 安卓Android开发快速入门

    文章目录 UI组件(控件) 布局管理器 LinearLayout(线性布局) relativelayout(相对布局) 使用控件的步骤 设置点击事件步骤的优化 TextView 应用场景 Button ...

  5. iphone开发收藏

    IPhone之自定义弹出窗口 http://blog.sina.com.cn/s/blog_4adf31ea0100nw42.html 多个UIAlertView的使用 http://heidianf ...

  6. java实现pdf修改,或者在Java中使用iText pdf更改pdf页面的颜色

    小编典典 虽然该问题的答案中给出的建议有效,但这并不是您可以获得的最佳建议.如果我早些时候看过您的原始问题,我将以不同的方式回答.我会建议您使用页面事件,如PageBackgrounds示例中那样. ...

  7. R语言ggplot2在可视化图像中添加横线并在横线中添加文本、为横线中添加的文本添加文本框、自定义文本框的填充色(background color for a text annotation)

    R语言ggplot2在可视化图像中添加横线并在横线中添加文本.为横线中添加的文本添加文本框.自定义文本框的填充色(background color for a text annotation) 目录

  8. R语言使用magick包的image_border函数和image_background函数自定义图像的边界和背景(Change image border and background)

    R语言使用magick包的image_border函数和image_background函数自定义图像的边界和背景(Change image border and background) 目录

  9. R语言ggplot2可视化自定义可视化结果的背景色(background color)实战:改变整个画板(panel)的背景色、改变图像(plot)区域的背景色

    R语言ggplot2可视化自定义可视化结果的背景色(background color)实战:改变整个画板(panel)的背景色.改变图像(plot)区域的背景色 目录

最新文章

  1. docker-compos
  2. Elasticsearch-04 ES中的术语和基本用法
  3. HDU4394(数论中的广搜)
  4. Ubuntu链接ubuntu服务器
  5. UVA 11584—— Partitioning by Palindromes
  6. std::string删除首字符
  7. 成为一个优秀的前端工程师,其实你也可以!
  8. python接收前端post数据_python实现通过flask和前端进行数据收发
  9. 宿舍物联网门锁系统之个人小程序注册
  10. 商用密码产品认证-金融数据密码机
  11. visio画两条直线交叉但不弯曲不跨线
  12. php中单选框可以默认选中吗,php selectradio和checkbox默认选择的简单示例
  13. Pandas按行列求和
  14. 微信小程序2D canvas绘制分享海报
  15. 电脑总是区域性白屏,求助各位大佬。
  16. OCR-光学符号识别
  17. angularjs pdf插件_AngularJS权威教程 PDF扫描版[14MB]
  18. Openwrt安装ddns
  19. 三刷CPA注册会计师之会计决胜之道
  20. Wireshark抓包分析之ICMP协议包

热门文章

  1. MySqlClient访问tinyint字段返回布尔值
  2. leetcoder reverse polish notation解题笔记
  3. c++类中成员的构造顺序
  4. LINUX 硬链接与软链接的区别
  5. 用OpenCV实现图像的水平镜像(翻转)变换和竖直镜像(翻转)变换(垂直镜像变换)的源码
  6. andorid简单计算器java源码_Android之一个简单计算器源代码
  7. linux进程--自旋锁和互斥锁的区别(十五)
  8. leetcode算法题--n个骰子的点数
  9. linux用户态驱动--VIFIO、IOMMU、UIO(二)
  10. KotlinPoet