android - 缩放位图以适合 Canvas

标签 android bitmap scaling surfaceview

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

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 Canvas 上,它会完美缩放。

最佳答案

我将添加到 nycynik 和 nikmin 的回答中。

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

关于android - 缩放位图以适合 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115084/

相关文章:

android - 如何使用 fl_chart 显示工具提示指示器?

Android Intent 打开用户的首选浏览器

android - 解析 Volley 错误

android - 在 Canvas 内拖动图像以更改其位置

android - 在 Android 上的 Delphi 中获取总内存和可用内存

android - Eclipse 图形布局 : Unable to resolve drawable . .. 在属性 "background"中

Delphi TBitmap - 为什么 Pixels 和 ScanLine 不同?

matlab - 通过 cuFFT 在逆 FFT 中缩放

MySQL:如何在多只读架构中保证完整性

Java - 我需要帮助理解 UI 缩放到不同的屏幕尺寸