java - 为什么这个笔划这么零散,为什么只划到里面?

标签 java awt java-2d

我正在使用 LineBreakMeasurer 结合 TextLayout 在图像上绘制一些文本,但由于某种原因,笔划仅抚摸内部,而且不是很干净。 这是我正在谈论的一个例子: http://i.imgur.com/eHtTw4p.png

当我不将字母绘制在顶部并增加笔划宽度时,它实际上会在内部而不是外部变厚。

这是我的代码:

        float y = 0.0f;
        float wrappingWidth = img.getWidth() * 0.8f;
        LineBreakMeasurer measurer = new LineBreakMeasurer(str.getIterator(), imageGraphics.getFontRenderContext());
        while (measurer.getPosition() < sentence.length()) {
            TextLayout layout = measurer.nextLayout(wrappingWidth);
            y += layout.getAscent();
            float x =  ((wrappingWidth * 0.8f) - layout.getVisibleAdvance()) / 2f + (wrappingWidth * 0.2f);

            AffineTransform transform = new AffineTransform();
            transform.translate((double)x, (double)y);
            Shape outline = layout.getOutline(transform);

            imageGraphics.setColor(Color.black);
            imageGraphics.setClip(outline);
            imageGraphics.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER));
            imageGraphics.draw(outline);
            imageGraphics.setColor(Color.white);
            imageGraphics.setStroke(new BasicStroke());

            layout.draw(imageGraphics, x, y);
            y += layout.getDescent() + layout.getLeading();
        }

我不确定我做错了什么。有谁知道吗?

最佳答案

在绘制轮廓之前创建 Graphics 上下文的另一个副本...

Graphics2D sg = (Graphics2D)imageGraphics.create();
sg.setColor(Color.black);
sg.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER));
sg.draw(outline);
sg.dispose();

我也会删除剪辑......

例如,我不想“抚摸”生成的形状,而是“填充”背景颜色并在其上“绘制”轮廓颜色......

Outline

Graphics2D sg = (Graphics2D) g2d.create();
AffineTransform transform = new AffineTransform();
transform.translate((double) drawPosX, (double) drawPosY);
Shape outline = layout.getOutline(transform);

sg.setColor(Color.WHITE);
sg.fill(outline);
sg.setColor(Color.BLACK);
sg.draw(outline);
sg.dispose();

但如果您想要“漂亮”的粗笔画,请使用 BasicStroke.JOIN_ROUND 而不是 BasicStroke.JOIN_MITER

Stroked

Graphics2D sg = (Graphics2D) g2d.create();
AffineTransform transform = new AffineTransform();
transform.translate((double) drawPosX, (double) drawPosY);
Shape outline = layout.getOutline(transform);

sg.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
sg.setColor(Color.BLACK);
sg.draw(outline);
sg.dispose();

关于java - 为什么这个笔划这么零散,为什么只划到里面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29269169/

相关文章:

java - 无法实例化以下类 : - com. google.android.gms.ads

java - C# 数据到 Java

java - 对带有重音符号等特殊字符的数组进行排序

java - 打印整个程序布局

Java Doublebuffer - 为什么我们要清除暴露区域?

java - 当使用 throws 关键字调用 void 时,所有抛出的错误都适用于我调用 void 的地方

java - JOptionPane.showinputdialog 在小程序中打开两次

java - JSON 中的自定义对象显示

java - 设置 java applet 的起始坐标

java - Java中如何计算Path2D的长度?