Java中的9-patch图像缩放类似于什么?

6
我不确定这是否是正确的提问位置,但我想知道是否有类似于Android上的9 patch images的东西,但是针对Java,例如Oracle,PC java。所有我的谷歌搜索只显示给我Android,因为人们称之为Java,但实际上并不完全相同。
我找到了LibGdx,但它对于我正在寻找的单个九宫格能力来说有点沉重。
九宫格图像是具有'9'区域的图像,其中角落通常是“不缩放”的,而侧壁和中心区域则被拉伸以适应屏幕。 Android的示例:http://developer.android.com/tools/help/draw9patch.html 是否有人知道可以像这样缩放的东西? 我需要支持PNG的内容。

2
谷歌搜索“Swing按钮的类似9-patch”,前几个链接指向“weblookandfeel”,这似乎是您要找的。http://weblookandfeel.com/nine-patch-editor/ - Paul Samsotha
使用Java2D/ImageIO。您可以使用正确的转换和缩放(AffineTransform)在BufferedImage上绘制所有内容,并使用ImageIO将其写成PNG格式。 - Erwin Bolwidt
1个回答

1
如果你正在寻找一种在Java组件上使用9-patch图像的方法,我曾在这里提出了同样的问题:如何在JPanel上使用9-patch图像作为背景? 简短的答案是否定的,你不能这样做。

长的答案是:如果你将图像分成9个部分(边框、角落和中心),并创建一个组件,在重新绘制时移动和调整图像大小,那么你就可以实现它。

下面的示例是针对我的情况进行调整的:

  • 该组件是一个JPanel。
  • 面板的中心必须是透明的,因此我需要少一个图像。
  • 该组件不会比给定的图像更小。
  • 图像具有透明度,这解释了代码中的setOpaque(false)调用。
  • 代码是初稿。

以下是代码:

public class NinePatchLikePanel extends JPanel{
private JPanel corner_top_l;
private JPanel corner_top_r;
private JPanel corner_bot_l;
private JPanel corner_bot_r;

private JPanel border_ver_l;
private JPanel border_ver_r;
private JPanel border_hoz_t;
private JPanel border_hoz_b;

private int min_width, min_height;

private int corners_width;
private int corners_height;
private int borders_width;
private int borders_height;


public NinePatchLikePanel (String[] urls) {

    if(urls.length != 8) {
        throw new UnsupportedOperationException("Exception to be managed!");
    } else {
        corner_top_l = new JPanelWithBackground (urls [0]);
        corner_top_r = new JPanelWithBackground (urls [1]);
        corner_bot_r = new JPanelWithBackground (urls [2]);
        corner_bot_l = new JPanelWithBackground (urls [3]);

        border_hoz_t = new JPanelWithBackground (urls [4]);
        border_ver_r = new JPanelWithBackground (urls [5]);
        border_hoz_b = new JPanelWithBackground (urls [6]);
        border_ver_l = new JPanelWithBackground (urls [7]);

        corners_width   = corner_top_l.getWidth();
        corners_height  = corner_top_l.getHeight();

        borders_width   = border_hoz_t.getWidth();  
        borders_height  = border_ver_l.getHeight();

        min_width   = 2 * corners_width  + borders_width;
        min_height  = 2 * corners_height + borders_height;

        this.setSize (min_width, min_height );
        this.setMinimumSize ( new Dimension (min_width, min_height) );
        this.setOpaque(false);
        this.setLayout(null);
        this.add(corner_top_l);
        this.add(corner_top_r);
        this.add(corner_bot_l);
        this.add(corner_bot_r);

        this.add(border_hoz_t);
        this.add(border_ver_r);
        this.add(border_hoz_b);
        this.add(border_ver_l);
    }
}

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

    int actual_width = this.getWidth();
    int actual_height = this.getHeight();

    int _x = actual_width - corners_width;
    int _y = actual_height - corners_height;

    corner_top_l.setLocation(0, 0);
    corner_top_r.setLocation(_x, 0);
    corner_bot_l.setLocation(0, _y);
    corner_bot_r.setLocation(_x, _y);

    int new_borders_width  = _x - corners_width;
    int new_borders_height = _y - corners_height;


    border_hoz_t.setLocation(corners_width, 0);
    border_hoz_t.setSize(new_borders_width, border_hoz_t.getHeight());

    border_ver_r.setLocation(_x, corners_height);
    border_ver_r.setSize(border_ver_r.getWidth(), new_borders_height);

    border_hoz_b.setLocation(corners_width, _y);
    border_hoz_b.setSize(new_borders_width, border_hoz_b.getHeight());

    border_ver_l.setLocation(0, corners_height);
    border_ver_l.setSize(border_ver_l.getWidth(), new_borders_height);
}

}

以下是JPanelWithBackground类的代码:

public class JPanelWithBackground extends JPanel { 
Image bg = null; 

public JPanelWithBackground(String url) { 
    try{
        bg = ImageIO.read(getClass().getResourceAsStream(url));
        int height = bg.getHeight(null);
        int width  = bg.getWidth(null);
        Dimension d = new Dimension(width,height);
        this.setSize (width, height);
        this.setMinimumSize ( d );
        this.setOpaque(false); 
    } catch (IOException ex) {
        //TODO: Manage this exception in a better way
            System.err.println(ex);
            System.exit(1);
    }  
} 

@Override
public void paintComponent(Graphics g) { 
    super.paintComponent(g);
    if (bg != null)
        g.drawImage(bg, 0, 0, this.getWidth(), this.getHeight(), null);
}
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接