缩放位图以适合画布

时间:2011-11-13 22:00:19

标签: android bitmap scaling surfaceview

我试图在机器人上编写游戏,我处理不同屏幕分辨率的方式是我制作一个目标分辨率(320x480)的位图,从中制作一个画布并使用固定坐标绘制其上的所有元素,然后我只是在surfaceView画布上绘制这个位图,它在不同的屏幕上重新缩放。问题是,当我在框架上绘制内容时,即使框架与位图的大小相同,位图也会超出范围。 (位图是320x480,它会拉伸并且不适合屏幕)以下是代码:

public class Graphics {

private Bitmap frameBuffer, grid;
private Canvas canvas;

public Graphics(Context context) {

    frameBuffer = Bitmap.createBitmap(320, 480, Config.ARGB_8888);
    canvas = new Canvas(frameBuffer);

    grid = BitmapFactory.decodeResource(context.getResources(),
            R.drawable.grid);
}

public Bitmap present() {
    canvas.drawColor(Color.WHITE);
    canvas.drawBitmap(grid, 0, 0, null);
    return frameBuffer;
}

和SurfaceView类:

public class GameView extends SurfaceView implements Runnable {

private SurfaceHolder holder;
private Boolean running;
private Thread renderThread;
private Graphics graphics;

public GameView(Context context, Graphics graphics) {
    super(context);
    this.holder = getHolder();
    this.graphics = graphics;
}

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

public void run() {
    Rect dstRect = new Rect();
    while (running) {
        if (!holder.getSurface().isValid())
            continue;

        Bitmap frameBuffer = graphics.present();

        Canvas canvas = holder.lockCanvas();
        canvas.getClipBounds(dstRect);
        canvas.drawBitmap(frameBuffer, null, dstRect, null);
        holder.unlockCanvasAndPost(canvas);
    }
}

public void pause() {
    running = false;
    while (true) {
        try {
            renderThread.join();
            break;
        } catch (InterruptedException e) {
            // retry
        }
    }
}

}

任何人都可以给出一些提示吗? PS如果我只是将位图直接绘制到SurfacView画布上,它就可以完美缩放。

1 个答案:

答案 0 :(得分:4)

我要加入nycynik和nikmin的答案。

您可以利用'createScaledBitmap'功能将Bitmap缩放到屏幕大小(好吧,画布)。尝试使你的Bitmap资源相当高,以便如果它在更大的屏幕上使用,它将不会有丑陋的缩放工件。