Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在SurfaceView画布上平铺位图_Android_Bitmap_Android Canvas_Surfaceview_Tile - Fatal编程技术网

Android 在SurfaceView画布上平铺位图

Android 在SurfaceView画布上平铺位图,android,bitmap,android-canvas,surfaceview,tile,Android,Bitmap,Android Canvas,Surfaceview,Tile,我无法平铺位图。我想将位图绘制到二维数组中定义的坐标 我想能够画出,比如说,草,到特定坐标,水,等等,到其他坐标 我花了好几天的时间试图弄明白这一点,如果有任何见解,我将不胜感激。我只能让画布绘制1个“草”位图,因此我觉得我的for循环中有一个错误。我看了很多其他的瓷砖,不希望每一块瓷砖都是一样的。这是我的密码: MapLoader.java public class MapLoader extends SurfaceView implements SurfaceHolder.Callback,

我无法平铺
位图
。我想将
位图
绘制到二维
数组
中定义的坐标

我想能够画出,比如说,草,到特定坐标,水,等等,到其他坐标

我花了好几天的时间试图弄明白这一点,如果有任何见解,我将不胜感激。我只能让
画布
绘制1个“草”
位图
,因此我觉得我的for循环中有一个错误。我看了很多其他的瓷砖,不希望每一块瓷砖都是一样的。这是我的密码:

MapLoader.java

public class MapLoader extends SurfaceView implements SurfaceHolder.Callback,
    Runnable {

SurfaceHolder holder;
Thread thread;

Bitmap grass = BitmapFactory.decodeResource(getResources(),
        R.drawable.grass);
boolean running = false;

int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 },
        { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 },
        { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } };

public MapLoader(Context context) {
    super(context);

    holder = getHolder();
    holder.addCallback(this);
}

public MapLoader(Context context, AttributeSet attrs) {
    super(context, attrs);

    holder = getHolder();
    holder.addCallback(this);
}

public MapLoader(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    holder = getHolder();
    holder.addCallback(this);
}

public void pause() {
    running = false;

    while (running) {
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        break;
    }
    thread = null;
}

public void resume() {
    running = true;
    thread = new Thread(this);
    thread.start();

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {

    running = true;
    thread = new Thread(this);
    thread.start();

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    Canvas c = holder.lockCanvas();
    draw(c);
    holder.unlockCanvasAndPost(c);

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
public void run() {

    while (running == true) {

        // performs drawing to the canvas
        if (!holder.getSurface().isValid()) {

            continue;
        }

        Canvas c = holder.lockCanvas();

        int x = 0;
        int y = 0;

        for (x = 0; x < grassCoords.length; x += grass.getWidth()) {

            for (y = 0; y < grassCoords.length; y += grass.getHeight()) {

                c.drawBitmap(grass, x, y, null);
            }

        }

        holder.unlockCanvasAndPost(c);

    }

}

}
public class Test extends Activity {

MapLoader mapLoader;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mapLoader = new MapLoader(this);
    setContentView(mapLoader);

}
}
任何帮助或建议(即使是有效方法的链接)都将不胜感激

谢谢


马特

很难理解你想做什么

如何将坐标编码到
grassCoords
数组中?作为其当前形式,它具有
5x5
元素

int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 },
        { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 },
        { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } };
因为它的名字中有
grass
,我假设你只想画grass,那么你可以这样定义它

int[][] grassCoords = new int[][] { {0, 0}, {16, 16}, {32, 32} };
在像
{0,0}
这样的每个元素上面,都是草瓷砖的一个坐标

第二个问题是在循环中,除了数组长度外,您不从
grassCoords
读取任何数据,当您增加索引时,您会使用
grass.getWidth()
来增加它,这实际上没有意义

    int x = 0;
    int y = 0;

    for (x = 0; x < grassCoords.length; x += grass.getWidth()) {

        for (y = 0; y < grassCoords.length; y += grass.getHeight()) {

            c.drawBitmap(grass, x, y, null);
        }

    }
intx=0;
int y=0;
对于(x=0;x
您应该正确地迭代数组并从中获取数据

    int x = 0;
    for (x = 0; x < grassCoords.length; x++) {
        c.drawBitmap(grass, grassCoords[x][0], grassCoords[x][1], null);
    }
intx=0;
对于(x=0;x
如果我是你,我会至少研究一次相关部分

for (x = 0; x < grassCoords.length; x += grass.getWidth()) {
    for (y = 0; y < grassCoords.length; y += grass.getHeight()) {
        c.drawBitmap(grass, x, y, null);
    }
}

请记住,如果您只想以固定的间隔填充平铺,则无需定义坐标。它们都是倍数,所以定义一个坐标数组没有多大意义。只需考虑每个瓷砖点作为一个网格点,并乘以瓦片的高度/宽度。

谢谢链接和解释。起初我很难理解2d数组。这两个答案都很有帮助,教会了我很多东西。谢谢您和@Geobits!
for(int x = startX; x < endX; x += grass.getWidth()){
    for(int y = startY; y < endY; y += grass.getHeight()){
        c.drawBitmap(grass, x, y, null);
    }
}