缩放位图以适合画布

use*_*941 7 scaling android bitmap 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;
}
Run Code Online (Sandbox Code Playgroud)

和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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

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

小智 4

我将补充 nycynik 和 nikmin 的答案。

您可以利用“createScaledBitmap”函数将位图缩放到屏幕(也就是画布)的大小。尝试使您的位图资源具有相当高分辨率,这样如果在较大的屏幕上使用它,就不会出现难看的缩放伪像。