【问题标题】:How to fade out the edges of a Java2D Area object?如何淡出 Java2D 区域对象的边缘?
【发布时间】:2016-10-25 10:14:08
【问题描述】:

我有一个方法可以根据屏幕上事物的位置创建阴影,该方法的最终产品是一个区域,然后我将其绘制到屏幕上,它包含同一区域中屏幕上的所有阴影。这是因为绘制的阴影不透明度很低,所以如果不是全部,它们会重叠,不透明度会使它看起来很奇怪。

我希望阴影看起来像是淡出的问题,但我完全不知道如何,或者这是否可能。有没有办法软化区域的边缘或使它们渐变淡出?我试图做 graphics2D.setPaint(new GradientPaint[a gradient effect]) 但它什么也没做。

提前致谢

编辑: 这是程序在“建筑”矩形周围制作阴影的屏幕截图。绿色矩形是显示阴影的效果。我想要的最终结果不是阴影突然结束,而是应该淡出。

【问题讨论】:

  • 也许你给我们展示一个示例区域和你遇到的问题(一张图片说超过 1000 个字)
  • 我添加了截图
  • 呃,抱歉,您尝试添加图片时出现问题:/图片不可见!
  • 糟糕,真实添加!

标签: java gradient shadow java-2d area


【解决方案1】:

我猜你在为渐变设置正确的颜色时遇到了问题:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(Color.GREEN);            
    g.fillRect(30, 30, 50, 20);

    Graphics2D g2d = (Graphics2D) g;
    Polygon p = new Polygon(new int[]{10,20,50,50,40,10}, new int[]{10,10,40,50,50,20}, 6);
    Area a = new Area(p);

    Color b = new Color(0xFF000000, true); //using colors with transparency!!!
    Color w = new Color(0x00FFFFFF, true); //using colors with transparency!!!

    //try to use proper values for the x/y values - both, start and end
    GradientPaint gradient = new GradientPaint(0, 0, b, 40, 40, w);                     
    g2d.setPaint(gradient);
    g2d.fill(a); // fill your area!
}

结果是带有 alpha 的渐变(透明度)...

用红色绘制的区域用渐变绘制的区域

不要忘记将 alpha 值 0xAARRGGBB 设置为 FF 以实现 100% 不透明(0xFF000000 是黑色 100% 不透明)为 0(0x00FFFFFF 白色,100% 透明)

【讨论】:

  • 感谢您的回答,但不幸的是,此方法对我不起作用,因为该区域包含多个阴影(对我发布的图像进行成像,但屏幕上还有其他几个“建筑物”,每个都有阴影,其中这些阴影中的每一个都在一个区域中。这意味着我无法获得渐变线的端点。这就是为什么我对如何使区域的边缘变暗/淡化更加好奇。
  • @Miles 你能告诉我更多关于你所在地区的信息吗?
  • 因此,每次添加新建筑物时,都会执行一个生成阴影的方法,从技术上讲,该方法会根据光源的位置查看每个建筑物的角落并相应地生成一个多边形。然后它将这些多边形中的每一个添加到一个区域(只是 Java2D 区域,如 Area a = new Area(); a.add(polygon))。这是因为阴影是部分透明的,如果我没有将它们添加到一个区域,在绘制时基本上忽略重叠,它们会在阴影的重叠处显得更暗。
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2018-09-24
相关资源
最近更新 更多