2013-11-23 28 views
6

我不知道这是否是正确的地方问,但我想知道是否有类似于Android上的9个补丁图像,但对于Java,如Oracle,PC Java。我所有的谷歌搜索都只显示了我的android,因为人们称之为Java,但它并不完全相同。针对Java的9补丁类图像缩放?

我已经找到了LibGdx,但是对于我所需要的单一九段补丁功能来说它是相当高的。

九块图像是一个具有'9'区域的图像,通常在侧壁和中心区域被拉伸以适应屏幕时,角部“未缩放”。 来自Android的示例:http://developer.android.com/tools/help/draw9patch.html

有人知道任何可以缩放的东西吗?我需要一些可以支持PNG的东西。

+2

谷歌'类似9补丁摆动buttons' weblookandfeel'似乎是前几个链接'成为你正在寻找的东西。 http://weblookandfeel.com/nine-patch-editor/ –

+0

使用java2d/imageio。您可以使用正确的平移和缩放(AffineTransform)在BufferedImage上绘制所有内容,并使用图像将其作为PNG写出 –

回答

2

如果您正在寻找一种在Java组件上使用9修补图像的方法,我在这里问了同样的问题:How use a 9-patch image as background on a JPanel?并且简短答案是否定的,您不能。

长的一个是:如果您在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); 
} 
}