0

私が望むのは、最善の方法が何であれ、いくつかまたは1つの方法に分割できることです。

(フィールドとして) 設定されている 4 つの値があります。

  1. 画像の横幅 画像全体(いわばキャンバス)
  2. 画像全体の高さ(キャンバスの高さ)
  3. パディング (パディングとして使用するピクセル数)
  4. 幅と高さに個別に必要な画像の数 (個別の値にすることができます)

私が欲しいのは、小さな画像を中に入れている画像全体を持つことです(これらは、メソッドから取得したいビットマップサイズです)。

私は基本的に、幅と高さの両方の画像のサイズを内部に入れたいと思っています。全体画像ビューで小さな画像の座標を調整します。

小さな例は次のとおりです。

  • 画像の幅は 200 で、4 のパディングが必要で、画像の 1 行に 3 つの画像が必要です。
  • 計算は次のようになります。

    (200 - (4*(3+1))) / 3 = 61,33;

  • 3+1 は、小さな画像の両側にパディングが必要なためです。

しかし、これは幅のみです。高さにも適用される普遍的なソリューションが必要です。

そして、canvas-image 内にあるすべての画像の高さと幅を計算します。

そして、砂糖を上にかけるだけです。内部にあるすべての画像の x 座標と y 座標が必要です。

これはどのように行うことができますか?そして、どうすればすべての値を取得できますか? ビットマップ (私はアンドロイドを開発しています) は ArrayList に格納されます。

基本的には、基本的なグリッド レイアウトが必要です: http://developer.android.com/images/ui/gridview.png この画像に基づいた値:

  • 私は水色の領域のサイズを持っています,
  • 紺色の画像間のスペースを含む (パディング)
  • そして、すべての行と列にいくつの濃い青色のスポットが必要ですか。

私が欲しいのは、サイズ (濃い青のスポットの幅と高さ) と、それらの画像の座標 (水色の領域、x 座標と y 座標) に配置する必要がある場所です。

誰もこれに対する良い解決策を持っていますか?

明確にするためにテキストを更新しました

4

2 に答える 2

1

これは私がやっていることとやりたかったことのコードです。誰かがコードを改善する方法を考えているなら、私は受け入れた答えを変更します。

public class ClassName {

public static int bitmapSizeWidth;
public static int bitmapSizeHeight;
public static final int bitmapPadding = 8;
public static final int howManyImagesColumn = 3;
public static final int howManyImagesRows = 2;

public static Bitmap folderBitmap(ArrayList<Bitmap> bitmapArray, int imageViewWidth, int imageViewHeight) {
    bitmapSizeWidth = imageViewWidth;
    bitmapSizeHeight = imageViewHeight;

    Bitmap b = Bitmap.createBitmap(bitmapSizeWidth, bitmapSizeHeight, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(b);

    //Lets do it in a set coordinate system now
    if (bitmapArray.size() >= 1)
        c.drawBitmap(bitmapArray.get(0), bitmapPadding, bitmapPadding, paint);

    if (bitmapArray.size() >= 2)
        c.drawBitmap(bitmapArray.get(1), calculateSecondCoord().xPos, bitmapPadding, paint);

    if (bitmapArray.size() >= 3)
        c.drawBitmap(bitmapArray.get(2), calculateThirdCoord().xPos, bitmapPadding, paint);

    if (bitmapArray.size() >= 4)
        c.drawBitmap(bitmapArray.get(3), bitmapPadding, calculateSecondCoord().yPos, paint);

    if (bitmapArray.size() >= 5) {
        c.drawBitmap(bitmapArray.get(4), calculateSecondCoord().xPos, calculateSecondCoord().yPos, paint);
    }

    if (bitmapArray.size() >= 6) {
        c.drawBitmap(bitmapArray.get(5), calculateThirdCoord().xPos, calculateSecondCoord().yPos, paint);
    }

    return b;
}

public static BitmapSize calculateSingleBitmapSize(int imageViewWidth, int imageViewHeight) {
    bitmapSizeWidth = imageViewWidth;
    bitmapSizeHeight = imageViewHeight;
    BitmapSize bsize = new BitmapSize();
    bsize.widthSize = (int) (bitmapSizeWidth -
            (bitmapPadding * (howManyImagesColumn + 1))) / howManyImagesColumn;
    bsize.heightSize = (int) (imageViewHeight - (bitmapPadding * (howManyImagesRows + 1))) / howManyImagesRows;
    return bsize;
}

/*
 * First coord = padding
 * Second coord (bitmapPadding) + calculateSingleBitmapSize(bitmapSizeWidth);
 * Third coord (bitmapPadding * 3) + (calculateSingleBitmapSize(bitmapSizeWidth) * 2)
 * The math is supposed to be correct but can perhaps be done in a more efficient way
 */
private static BitmapCoord calculateSecondCoord() {
    BitmapCoord bCoord = new BitmapCoord();
    bCoord.xPos = (int) (bitmapPadding * (howManyImagesColumn - 1)) + calculateSingleBitmapSize(bitmapSizeWidth, bitmapSizeHeight).widthSize;
    bCoord.yPos = (int) (bitmapPadding * (howManyImagesRows)) + calculateSingleBitmapSize(bitmapSizeWidth, bitmapSizeHeight).heightSize;

    return bCoord;
}

private static BitmapCoord calculateThirdCoord() {
    BitmapCoord bCoord = new BitmapCoord();
    bCoord.xPos = (int) (bitmapPadding * howManyImagesColumn) + calculateSingleBitmapSize(bitmapSizeWidth, bitmapSizeHeight).widthSize * 2;
    bCoord.yPos = (int) (bitmapPadding * howManyImagesRows - 1) + calculateSingleBitmapSize(bitmapSizeWidth, bitmapSizeHeight).heightSize * 2;

    return bCoord;
}

public static class BitmapSize {
    public int widthSize;
    public int heightSize;
}

static class BitmapCoord {
    int xPos;
    int yPos;
}
}
于 2013-07-19T08:08:11.193 に答える
1

あなたが説明しているのは、ゲーム開発者がスプライトシート、タイルシート、タイルセットなどと呼んでいるものです。

これらすべての背後にある一般的な考え方は、特定のタイプの 1 つの画像ファイルがあり、その画像内にサブイメージを作成し、それを取り出してプログラムで個別に使用できるというものです。通常、ビデオ ゲームでは、これらは一貫したサイズですが、そうである必要はありません。

このリンクの回答を確認してください: How to extract part of this image in Java? ここでの答えは、画像をいくつかの部分に分割する方法を説明しています。

探しているものが見つからない場合は、たとえばゲーム開発者がスプライトシートをどのように処理しているかを調べて、その方法を理解してください。

于 2013-07-17T13:10:30.360 に答える