【问题标题】:Scaling a Bitmap to fit in a canvas缩放位图以适合画布
【发布时间】:2011-12-28 05:48:56
【问题描述】:

我正在尝试在 droid 上编写游戏,我处理不同屏幕分辨率的方法是制作具有目标分辨率 (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 画布上,它会完美缩放。

【问题讨论】:

  • 亲爱的.. 有解决方案吗?我想你需要先得到屏幕的宽度和高度。然后将drawBitmap与rectf一起使用..请尝试..
  • 您的应用程序是全屏的吗?否则,您可能会有一个顶部栏或一些带有软按钮的底部栏占据屏幕的一部分?
  • 这在非常大的屏幕上可能看起来也很糟糕。 1024 - 3x,也许使用更大的图像并将其缩小。
  • 我认为您必须先扩展 grid,然后才能调用 canvas.drawBitmap(grid, 0, 0, null);。这样你就可以得到grid 和画布一样的大小。

标签: android bitmap scaling surfaceview


【解决方案1】:

我将补充 nycynik 和 nikmin 的答案。

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

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 2016-09-30
    • 1970-01-01
    • 2014-07-02
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2011-01-15
    相关资源
    最近更新 更多