batik详解(9)
扩展paint对象到SVG元素转换 SVGGraphics2D可以为通用的java 2d对象生成SVG元素,但是有时候你可以用你自己的类,比如java 2D Paint的执行接口。因为这个原因你需要写一个你将要设置在你的 SVGGeneratorContext中的
扩展paint对象到SVG元素转换
SVGGraphics2D可以为通用的java 2d对象生成SVG元素,但是有时候你可以用你自己的类,比如java 2D Paint的执行接口。因为这个原因你需要写一个你将要设置在你的SVGGeneratorContext中的ExtensionHandler。
在下边的例子中,我们定义ExtensionHandler的一个草图,这个草图允许转换一个Paint接口的Batik执行,名称叫LinearGradientPaint。
class MyExtensionHandler extends DefaultExtensionHandler {
public SVGPaintDescriptor handlePaint(Paint paint,
SVGGeneratorContext generatorCtx) {
if (paint instanceof LinearGradientPaint) {
LinearGradientPaint gradient = (LinearGradientPaint) paint;
// Create a new SVG 'linearGradient' element to represent the
// LinearGradientPaint being used.
String id = generatorCtx.getIDGenerator().generateID("gradient");
Document doc = generatorCtx.getDOMFactory();
Element grad = doc.createElementNS
(SVGSyntax.SVG_NAMESPACE_URI,
SVGSyntax.SVG_LINEAR_GRADIENT_TAG);
// Set the relevant attributes on the 'linearGradient' element.
grad.setAttributeNS(null, SVGSyntax.SVG_ID_ATTRIBUTE, id);
grad.setAttributeNS(null, SVGSyntax.SVG_GRADIENT_UNITS_ATTRIBUTE,
SVGSyntax.SVG_USER_SPACE_ON_USE_VALUE);
Point2D pt = gradient.getStartPoint();
grad.setAttributeNS(null, "x1", pt.getX());
grad.setAttributeNS(null, "y1", pt.getY());
pt = gradient.getEndPoint();
grad.setAttributeNS(null, "x2", pt.getX());
grad.setAttributeNS(null, "y2", pt.getY());
switch (gradient.getCycleMethod()) {
case MultipleGradientPaint.REFLECT:
grad.setAttributeNS
(null, SVGSyntax.SVG_SPREAD_METHOD_ATTRIBUTE,
SVGSyntax.SVG_REFLECT_VALUE);
break;
case MultipleGradientPaint.REPEAT:
grad.setAttributeNS
(null, SVGSyntax.SVG_SPREAD_METHOD_ATTRIBUTE,
SVGSyntax.SVG_REPEAT_VALUE);
break;
// 'pad' is the default...
}
// Here we should write the transform of the gradient
// in the transform attribute...
// Here we should write the stops of the gradients as
// children elements...
return new SVGPaintDescriptor
("url(#" + ref + ")", SVGSyntax.SVG_OPAQUE_VALUE, grad);
} else {
// Let the default mechanism do its job.
return null;
}
}
}
然后你需要在SVGGeneratorContext上,通过使用setExtensionHandler方法设定它。
SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(myFactory);
ctx.setExtensionHandler(new MyExtensionHandler());
SVGGraphics2D g2d = new SVGGraphics2D(ctx, false);
ctx.setExtensionHandler(new MyExtensionHandler());
SVGGraphics2D g2d = new SVGGraphics2D(ctx, false);
怎样查看生成的SVG文档
下面的代码详细描述怎么查看利用SVGGraphics2D对象生成的svg内容
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import org.apache.batik.swing.*;
import org.apache.batik.svggen.*;
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.*;
import org.w3c.dom.svg.*;
public class ViewGeneratedSVGDemo {
public static void main(String[] args) {
// Create an SVG document.
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
SVGDocument doc = (SVGDocument) impl.createDocument(svgNS, "svg", null);
// Create a converter for this document.
SVGGraphics2D g = new SVGGraphics2D(doc);
// Do some drawing.
Shape circle = new Ellipse2D.Double(0, 0, 50, 50);
g.setPaint(Color.red);
g.fill(circle);
g.translate(60, 0);
g.setPaint(Color.green);
g.fill(circle);
g.translate(60, 0);
g.setPaint(Color.blue);
g.fill(circle);
g.setSVGCanvasSize(new Dimension(180, 50));
// Populate the document root with the generated SVG content.
Element root = doc.getDocumentElement();
g.getRoot(root);
// Display the document.
JSVGCanvas canvas = new JSVGCanvas();
JFrame f = new JFrame();
f.getContentPane().add(canvas);
canvas.setSVGDocument(doc);
f.pack();
f.setVisible(true);
}
}
顶一下
(21)
95.5%
踩一下
(1)
4.5%
- 最新评论 查看所有评论
-
- 发表评论 查看所有评论
-
- SVG 和 XForms: 基础知识
- 使用 SVG 1.2 新的基于 XML 的扩展机制
- svgviewer中显示中文字体问题
- 使用脚本动态操作 SVG 文档
- 网络矢量图像SVG的实现与应用研究
- SVG鼠标拖动画线
- 网络图形标准SVG 的特征及其实现[学SVG必看] 2
- 基于SVG技术实现WebGIS的基本功能
- 环境下将报表数据导出EXCEL和WORD
- 基于SVG的WebGIS地图搜索研究与实现
- J2ME移动2D图形SVG技术快速入门
- NSIS安装制作基础教程
- 如何使用NSIS实现多目录安装设置
- 在SVG文档中遍历DOM子节点的问题
- SVG Batik项目-=ILOG Discovery Preview
