batik详解(9)

来源: 涛涛   日期:2007-06-07  我要评论  胶粘剂 结构胶 硅胶 密封胶 中国胶粘剂网
扩展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);
 
怎样查看生成的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%
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码: