为了账号安全,请及时绑定邮箱和手机立即绑定

使用 AWT 绘制的意外圆形边框

使用 AWT 绘制的意外圆形边框

凤凰求蛊 2022-04-28 17:23:51
java.awt.Graphics#drawOval使用 AWT,我使用and绘制边框java.awt.Graphics2D#setStroke。对于设置笔划的大小大于椭圆直径的情况,生成的边框与预期的不同。在这种情况下,笔划与圆另一侧的笔划重叠:圆形北笔划与南笔划重叠。AWT 以 XOR 方式呈现这种重叠,如下图所示。相反,我期望的是笔画重叠以 OR 方式绘制,因此在stroke width > circle diameter中心为黑色的所有情况下。有没有一种简单的方法可以设置将行为更改为 OR 重叠模式,即使圆的宽度或高度(然后是椭圆)不相等?相同的直径(10px)随着笔画宽度的增加:
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

基于 Marco13 在他的评论中提到的解决方案,我想出了这个自定义drawOval函数。一旦笔划宽度大于直径,它基本上会从 切换drawOval到。计算函数fillOval的位置和尺寸以匹配输出。fillOvaldrawOval


public static void drawOval(Graphics2D g2d, int strokeWidth, int x, int y, int width, int height) {

    int minLength = Math.min(width, height);

    int maxLength = Math.max(width, height);

    if (minLength >= strokeWidth) {

        g2d.drawOval(x, y, width, height);

    } else {

        int x1 = x - (strokeWidth - maxLength) / 2 - (maxLength / 2);

        int y1 = y - (strokeWidth - maxLength) / 2 - (maxLength / 2);

        int width1 = width + strokeWidth;

        int height1 = height + strokeWidth;

        g2d.fillOval(x1, y1, width1, height1);

    }

}

这是它的样子

//img1.sycdn.imooc.com//626a5d5900018fcb00421294.jpg

查看完整回答
反对 回复 2022-04-28
  • 1 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信