2013-11-23 8 views
6

私はこれが正しい場所であるかどうかは分かりませんが、アンドロイドには9パッチのイメージがあるのでしょうか?人々はJavaと呼んでいるので、すべての私のGoogleの検索は、私にアンドロイドを示していますが、実際には同じではありません。Java用の9パッチのような画像スケーリング?

私はLibGdxを見つけましたが、私が探している9パッチの能力はかなり重いです。

9つのパッチ画像は、9つの領域を持つもので、コーナーは通常、画面にフィットするようにサイドウォールと中央領域が伸びている間は「縮尺されていません」。 Androidからの例:http://developer.android.com/tools/help/draw9patch.html

誰もがこのように拡張することができることを知っていますか? PNGをサポートできるものが必要です。

+2

Googleの最初のいくつかのリンクbuttons'スイングのための '類似した9パッチweblookandfeel''ように見えますあなたが探しているものになる。 http://weblookandfeel.com/nine-patch-editor/ –

+0

java2d/imageioを使用してください。適切な変換とスケーリング(AffineTransform)を使用してBufferedImage上のすべてを描画し、imageioを使用してPNGとして書き出すことができます –

答えて

2

Javaコンポーネントで9パッチイメージを使用する方法を検索する場合は、ここで同じ質問をしました。How use a 9-patch image as background on a JPanel?と短い回答は「いいえ」です。

長い画像は次のとおりです。9つの画像(枠線、角、中央)で画像を分割し、塗り直すと画像を移動してサイズを変更するコンポーネントを作成できます。

私の場合のために適合されている次の例:

  • 成分はJPanelのです。
  • パネルの中央が透明でなければならないので、1つ少ないイメージが必要です。
  • コンポーネントが指定されたイメージより小さくなることはありません。
  • イメージには透明性があり、これはコード内の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); 
} 
} 
関連する問題