【问题标题】:Multiple independent layers in Graphics图形中的多个独立层
【发布时间】:2016-03-13 19:49:59
【问题描述】:

是否可以使用Graphics 拥有多个独立的绘图层?我实际上需要两层(如在 Photoshop、Gimp、Paint.NET 中...),我可以在其上绘制对象,并且我希望顶层的所有对象都出现在底层的所有对象之上,而与绘制的顺序无关对象被绘制。不是我可以先画一层的所有物体,再画另一层的所有物体。

例子:

  1. 在底层绘制红色实心圆圈
  2. 在顶层绘制绿色矩形
  3. 在底层绘制红色实心矩形
  4. 在顶层绘制绿色圆圈

期望的结果:两个空的绿色对象应该呈现在两个填充的红色对象之上。

我摆弄着使用JLayeredPaneCanvas,我能得到的最接近的是CanvasJComponent 之上,但不幸的是Canvas 背景不能是透明的,所以在JComponentCanvas 背景覆盖。

你能告诉我如何实现这一点(如果可能的话)?

【问题讨论】:

  • 看看下面我的解决方案。

标签: java swing graphics


【解决方案1】:

有几种方法可以做到这一点。您可以保留一个 BufferedImages 列表作为您的图像层并相应地渲染它们:

class AdvancePaint extends JPanel(){
    ArrayList<BufferedImage> layers;
    //Other constructors, variables, initializations not shown

    class AdvancePaint(){
        layers = new ArrayList<BufferedImage>();
    }

    public void addLayer(BufferedImage layer){
        layers.add(layer);
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for(BufferredImage buf : layers)  //render all layers
            g.drawImage(buf, 0, 0, width, height, null);
    }
}

以上代码将按照添加到列表中的顺序从列表中渲染 BufferedImage。如果您不想在每次重绘时都绘制所有图层,您可以随时添加另一个 draw(Graphics g) 方法,您可以选择要绘制到另一个 BufferedImage 上的图层。然后只在paintComponent(g)上绘制这个BufferedImage。

由于图层存储为Collection,因此您始终可以通过对它们进行排序或更改它们在列表中的位置来更改它们的渲染顺序。

您可以随时调整我示例中的小细节来定制您需要的内容。


添加图层:

BufferedImage layer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
advancePaint.addLayer(layer);

使用BufferedImage.TYPE_INT_ARGB,背景将是透明的,因此其他图层将能够“透光”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多