Масштабирование растрового изображения для размещения на холсте - PullRequest
7 голосов
/ 14 ноября 2011

Я пытаюсь написать игру для дроида. Я позабочусь о разном разрешении экрана: я делаю растровое изображение с целевым разрешением (320х480), создаю из него холст и рисую все элементы на нем, используя фиксированные координаты,Затем я просто рисую это растровое изображение на холсте 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 Ответ

4 голосов
/ 22 мая 2013

Я собираюсь добавить к nycynik и ответы nikmin.

Вы можете использовать функцию 'createScaledBitmap' для масштабирования растрового изображения до размера экрана (ну, холста).Постарайтесь сделать ваш растровый ресурс достаточно высоким, чтобы при его использовании на большом экране не было уродливых артефактов масштабирования.

...