自定义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();
    @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哦!<a href=' http://twaver.servasoft.com/?p=4832'>附件下载请见原文最下方</a>

 

vsCode 自定义修改背景图,不使用background插件,只操作源css文件 vsCode 自定义修改背景图,不使用background插件,只操作源css文件 前言 之前使用了background插件来自定义vscode的背景图,需要在配置文件中配置一下,然而背景图只能覆盖代码区,菜单区是不能覆盖的。结果最近vscode一更新,原来写的配置代码都木有了,哭死。这次我来修改一下vscode的源css文件,直接插张图片进去,总之先放效果图。 实现方法 图文一起上 1.先找到... 阅读详情

相关推荐

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

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

statistics+insight+vista+power 234

如何实现TWaver 3D颜色渐变

一般而言,须要实现3D物体的渐变,通常的思路就是通过2D绘制一张渐变canvas图片作为3D对象的贴图。这样的方式是能够解决这类问题的。只是对于一般用户而言,通过2D生成一张渐变的图片。有一定的难度,另外假设要生成的图片比較多。性能效率上会成为一个瓶颈,特别是渐变随着条件在不断变化的情况下。就须要每次绘制的时候都去生成一张渐变的canvas图,效率极其低。 在3D中,第二种通常的...

weixin_34248705的博客 123

基于Arduino的智能垃圾桶

通过本次简单的Arduino智能垃圾桶小实验可以快速了解Arduino的基本用法 1、材料准备 Arduino UNO HC-SR04超声波模块 SG90舵机 杜邦线 电源 电脑 2、代码分析 电机的控制 #include<Servo.h> #define duoji D5 Servo myduoji; void setup() { myduoji.attach(duoji); //舵机连接 Serial.begin(115200); } void loop() { myduoji.w

weixin_41679960的博客 1万+

Twaver-HTML5基础学习(26)背景

Twaver-HTML5基础学习(26)背景

见贤思齐焉,见不贤内自省 648

H3C设备VRF配置实战:5步搞定多业务网络隔离(附排错技巧)

本文详细介绍了在H3C设备上配置VRF(虚拟路由转发)实现多业务网络隔离的实战方法。通过五步配置流程,从创建VPN-instance、绑定接口到配置独立路由表,帮助网络工程师在单台设备上构建逻辑隔离的企业级网络,并分享了高级路由配置与常见排错技巧。

gold8的专栏 936

STM32F103C8T6用官方bootloader实现IAP升级操作方法

在使用STM32F103C8T6单片机IAP功能时,可以自己写bootloader程序,也可以使用官方bootloader文件。下面说一下使用官方bootloader的使用方法。 首先下载官方bootloader文件 目前使用的是这个版本,打开文件夹,选择适合自己编译器的工程。 目前使用的是keil,所以打开MDK-ARM文件夹 打开IAP工程 打开后根据自己的单片机型号,对工程进行简单的修...

HXYDJ的博客 1万+

TWaver HTML5学习笔记 —— 动态设置网元样式

一、学习内容概述:      学习如何在拓扑图中动态设置网元的样式。 二、学习内容总结: 1、添加属性表格:       1)、属性表格定义:使用twaver.controls.PropertySheet类,例如: var nodeStylePropertySheet = new twaver.controls.Property

Steven的专栏 4738

Frida实战:如何用adb快速连接网易mumu模拟器进行参数Hook(附常见CPU架构问题排查)

本文详细介绍了如何使用Frida和adb快速连接网易MuMu模拟器进行参数Hook,包括环境配置、架构适配、Frida-server部署及常见问题排查。特别针对CPU架构兼容性问题提供了实用解决方案,帮助开发者高效完成逆向调试任务。

weixin_29274969的博客 289

swizzle 自定义控件的 backgroundColor 方法

在 UITableViewCell 中使用 LCDefaultAvatarView的时候,发现在UITableView的默认多选状态下,如果选中cell, 那么cell中包含的 Avatar 背景会不显示,后面发现原因是 UITableView 会在选中的时候,给cell的 children view都设置 默认的 backgroundColor, 所以想到了 替换 backgroundCol...

tangaowen的专栏 425

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow)

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow) 包含所有数据和代码,支持一键运行(jupyter)

qq_40999533的博客 1482

【车间调度】车间调度问题的分类

本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流。 车间调度问题的分类 根据工件和车间构成不同,车间调度问题可分为以下几种 1.单机调度问题 在单机调度问题(S,SMP)中,加工系统只有一台机床,待加工的工件有且仅有一道工序,所有工件都在该机床上进行加工。此问题是最简单的调度问题,当生产车间出现瓶颈机床时的调度就可视为此调度问题。 ...

weixin_51656605的博客 7429

VScode 背景图插件 background 最详细自定义配置

1. 首先搜索并安装 background 插件 2. 打开文件 > 首选项 > 设置 3. 搜索 background 找到插件设置,点击在 settings.json 中进行自定义设置 4. 复制下面代码到 settings.json 文件中 "background.customImages": ["这里是图片路径"], "background.useDefault": false, //不使用默认背景图 "background.style": { //样式配置

豪不留情 2万+

LangChain从入门到精通最全教程

LangChain是一个用于构建基于大语言模型(LLM数据感知:连接外部数据源(文档、API等)智能代理:通过工具调用实现自主决策模块化设计:支持链式调用、记忆管理、提示词工程等from langchain . llms import BaseLLM class CustomLLM(BaseLLM) : def _call(self , prompt : str , ** kwargs) - > str : return f"自定义响应: {

Cachel Wood的博客 1409

background-cover 插件 + 自定义 CSS样式 -- 修改 vscode 背景

使用 background-cover 插件 + 自定义 CSS 样式,修改 vscode 背景

weixin_44112083的博客 5813

YOLOv12改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣ 什么!不知道如何改进模型⁉️ 本专栏所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行,性价比极高。2️⃣ 找不到合适的模块⁉️ 所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,并进行二次创新,新颖度高,创新度高,能够适应不同的任务场景。3️⃣ 不确定自己改进的步骤、结果是否正确⁉️ 订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容,非常适合新手。4️⃣ 团队内发表数篇SCI论

Limiiiing的博客 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

css3 background自定义select样式(仅适用于chrome)

首先我们先来了解下css3中background的一些新特性: 控制背景图片的尺寸 background-size: 固定的值或百分比/cover/contain 固定的值或百分比:有两个值,一个是显示背景的width,一个是显示背景的height.只设置一个值时,则是width的值,height为auto cover:保持图像本身的宽高比例,将图片缩放到正好完全覆盖定义背景的区域 ...

iteye_10268的博客 383

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android自定义background样式

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> &...

lceberg_boy的博客 1085

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android自定义View获取background的颜色和图片

我们自定义View的时候有时会用到background,为了调用者更好的使用,我们可以复用Android自带的background属性,而不是自定义属性.获取并修改background的内容如下(以自定义TextView为例): paint = new Paint(); paint.setAntiAlias(true); Drawable backgro

u013210543的博客 1万+

vscode-background配置全解析:从基础设置到高级自定义

vscode-background是一款能为你的VSCode编辑器添加背景图片的扩展插件,让你的编程环境更加个性化和舒适。通过简单的配置,你可以轻松设置不同区域的背景图片,打造专属的编辑器界面。 ## 快速入门:安装与启用插件 要开始使用vscode-background,首先需要安装并启用该插件。你可以通过VSCode的命令面板来执行相关操作。 [![vscode-background命令

gitblog_00009的博客 561

关于自定义checkbox-radio标签的样式的方法(label 和 background-position理解)

label label标签有一个很好的作用就是扩大表单控件元素的点击区域。 一般有两种方法可以达到效果:(1)使用label标签包裹表单控件(2)设置label标签的for属性和表单的id属性一致 这意味着有三种方式可以实现 1 <label for="checkbox"></label><input type="checkbox" id="ch...

Liuzhongbao123456的博客 321

改一行颜色代码就是你的主题:Alabaster 自定义配色实战教程(editor.background 到终端 ANSI)

Alabaster 是一款专为 **VS Code** 打造的极简**浅色主题**,以"只高亮 4 类语法"闻名。本文将带你拆解它唯一的主题文件,从 `editor.background` 编辑器背景色,一路改到**终端 ANSI 16 色**,零基础也能在几分钟内做出属于自己的 Alabaster 变体主题。 [![VS Code Alabaster 浅色主题截图:Clojure 代码语法高亮

gitblog_01130的博客 240

用background-image来做自定义下划线

用background-image来做自定义下划线 window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(g...

877

android开发中Button设置background自定义drawable不生效

在学习过程中,设置Button的background时,已经自定义了相关drawable却没有生效。 解决这个问题只需要小小的一步,即在 在res/values/themes.xml中进行修改 修改为 最后就有了自定义的drawable设置的效果啦 ...

Better_C的博客 4606

关于MpAndroidChart修改background为自定义图像

菜鸟一位,之前还在纠结项目不能导入n多个 github上下载或者自己建立的库文件,当修改完mpchart源码之后,发现不能导入,半天的时光耗费,发现了一个好的方法,将修改完源码的库打成jar包,导入到自己项目中。     可能大牛们都已经知道了,但是对于新手来讲确实眼前一亮。 具体jar包位置在库目录   比如  Xutils\build\intermediates\bundles\relea

zcy宇的博客 1286
上一篇: 用TWaver HTML5定制五彩斑斓的链路
下一篇: 如何让HTML5的表格支持后台排序与分页
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值