1

这是我第一次在这里提问,所以我会尽量保持话题。我试图通过创建适当大小的位图对象 ArrayList 并按顺序绘制它们来随机生成背景。顺便说一下,这个实现可以很好地加载单个位图;它只是在列表中磕磕绊绊。

在开始编写代码之前,我想指出,理想情况下,我会通过添加单个像素或图块来制作单个位图,并且确实尝试了一些变体,但它们都会导致黑屏;我开始认为这可能是我如何在画布上绘制的问题。无论如何,这就是我所拥有的:

首先,我生成随机 ArrayList,现在只使用 3 种颜色。我会让它返回列表,但它只是线程内引用线程变量之一的私有方法,所以它并不重要。

    private void genMap(Resources res)
    {
        // Load basic tiles.
        Bitmap green = BitmapFactory.decodeResource(res, R.drawable.green);
        Bitmap red = BitmapFactory.decodeResource(res, R.drawable.red);
        Bitmap blue = BitmapFactory.decodeResource(res, R.drawable.blue);

                    // All tiles must be the same size.
        int tile_width = green.getWidth();
        int tile_height = green.getHeight();
        int num_x = mCanvasWidth / tile_width;
        int num_y = mCanvasHeight / tile_height;

        for (int j = 0; j < num_y; j++)
        {
            for (int i = 0; i < num_x; i++)
            {
                double r = Math.random();
                Bitmap tile;
                if (r <= 1/3) {tile = green;}
                else if (r <= 2/3) {tile = red;}
                else {tile = blue;}
                // Create a new Bitmap in order to avoid referencing the old value.
                mBackgroundImages.add(Bitmap.createBitmap(tile));
            }
        }
    }

所以,这就是随机值映射到模式的方式。该方法在线程的构造函数中调用,每次调用 onCreate 时都会依次调用该方法;现在,我只是清除列表并每次制作一个新的随机模式:

...
Resources res = context.getResources();
mBackgroundImages = new ArrayList<Bitmap>();
genMap(res);
...

最后是draw方法;它可以通过 BitmapFactory.decodeResources 加载单个位图,但在执行此操作时会显示黑屏:

    private void doDraw(Canvas canvas)
    {
        /* Draw the bg.
         * Remember, Canvas objects accumulate.
         * So drawn first = most in the background. */
        if (canvas != null)
        {
            if (mBackgroundImages.size() > 0)
            {
                int tile_width = mBackgroundImages.get(0).getWidth();
                int tile_height = mBackgroundImages.get(0).getHeight();
                for (int y = 0; y < mCanvasHeight / tile_height; y++)
                {
                    for(int x = 0; x < mCanvasWidth / tile_width; x++)
                    {
                         // Draw the Bitmap at the correct position in the list; Y * XWIDTH + X, at pos X * XWIDTH, Y * YWIDTH.
                         canvas.drawBitmap(mBackgroundImages.get((x + y * (mCanvasWidth/tile_width))), x * tile_width, y * tile_height, null);
                    }
                }
            }
        }
    }

任何帮助将不胜感激,谢谢。

4

1 回答 1

0

您是否仔细检查了以下行的优先顺序?

((x + y * (mCanvasWidth/tile_width)))

不过有趣的问题是:你画的是纯色吗?我还要看看这是否真的在制作位图:

mBackgroundImages.add(Bitmap.createBitmap(tile));

您实际上可能只保留引用而不是创建大量位图,但这可能会在以后出现

于 2012-10-02T14:23:29.437 回答