Какие методы Canvas и Bitmap масштабируются по dpi (Android)?

Я знаю, что Android автоматически масштабирует растровые изображения, загруженные из res/drawable с помощью dpi. Я вручную отключил это с помощью параметров BitmapFactory, когда загружаю ресурсы для своей игры, такие как набор плиток.

//Loads Bitmaps for the tileset
public void loadTiles(int s) {
    Bitmap subimage = null;
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inScaled = false;
    Bitmap tileset = BitmapFactory.decodeResource(activity.getResources(), s, o);
    try {


        numTilesAcross = tileset.getWidth() / tileSize;
        tiles = new Tile[3][numTilesAcross];


        for(int col = 0; col < numTilesAcross; col++) {
            subimage = Bitmap.createBitmap(tileset,
                        col * tileSize,
                        0,
                        tileSize,
                        tileSize
                    );
            tiles[0][col] = new Tile(subimage, Tile.UNBLOCKED);
            subimage = Bitmap.createBitmap(tileset,
                        col * tileSize,
                        tileSize,
                        tileSize,
                        tileSize
                    );
            tiles[1][col] = new Tile(subimage, Tile.BLOCKED);
            subimage = Bitmap.createBitmap(tileset,
                        col * tileSize,
                        2 * tileSize,
                        tileSize,
                        tileSize
                    );
            tiles[2][col] = new Tile(subimage, Tile.TRIGGER);
        }

    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

Проблема в том, что когда я рисую их на своем холсте (который затем рисуется в представлении поверхности), если я тестирую игру с любым разрешением dpi ниже, чем mdpi, плитки масштабируются слишком мало с промежутком между ними, и если я тестирую что-то более высокое, они нарисованы слишком большими и перекрываются.

Главный вопрос заключается в том, какие методы масштабируются с использованием коэффициента dpi. Я рисую свои изображения, используя

//tiles[r][c].getImage() returns a Bitmap
canvas.drawBitmap(
                tiles[row][col].getImage(),
                (int)x + col * tileSize,
                (int)y + row * tileSize,
                null
            );

Масштабируется ли canvas.drawBitmap() с использованием dpi? Или масштабирование происходит с тем, как я получаю изображения в моем методе loadTiles(int s)? Я проверил ширину/высоту растровых изображений, загруженных в loadTiles, и они оказались нужного мне размера.

ПРИМЕЧАНИЕ. Я сам масштабирую окончательное изображение до экрана, размер всех растровых изображений, нарисованных на холсте, не должен зависеть от dpi.

РЕДАКТИРОВАТЬ: Вот несколько фотографий того, что происходит... Это mdpi, именно так он ДОЛЖЕН выглядеть >http://cdn.img42.com/e9359c298455d505c3317bd705372030.png

Это hdpi, обратите внимание, как объекты масштабируются и накладываются на плитку, нарисованную перед ними /540b7896947049250fea3f3fa5a08331.png

Это ldpi, обратите внимание, что плитки слишком маленькие и оставляют место между img42/420e938b3eebc503247cd0181b779402fe.png


person Steven Landow    schedule 15.04.2015    source источник
comment
Canvas.drawBitmap() методы НЕ масштабируют растровое изображение, они рисуют его 1:1   -  person pskink    schedule 15.04.2015
comment
Я так и думал, но не могу понять, почему это выглядит правильно только на устройствах mdpi. Главное, что я хочу знать, это то, какие методы автоматически масштабируют растровое изображение.   -  person Steven Landow    schedule 15.04.2015
comment
Например, BitmapFactory.decodeResource(), но вы его отключили, не так ли?   -  person pskink    schedule 15.04.2015
comment
Ага. Я позже загружу несколько скриншотов того, что происходит.   -  person Steven Landow    schedule 15.04.2015


Ответы (1)


Я понял. Я читал документацию для Canvas, и мне нужно установить плотность как на холсте, так и на растровых изображениях, когда они загружаются, вызывая

canvas.setDensity(DisplayMetrics.DENSITY_MEDIUM);
bitmap.setDensity(DisplayMetrics.DENSITYMEDIUM);

Соответствующая документация:

https://developer.android.com/reference/android/graphics/Canvas.html#setDensity%28int%29

https://developer.android.com/reference/android/graphics/Bitmap.html#setDensity%28int%29

Я также мог бы просто установить плотность пикселей всех изображений обратно на плотность пикселей системы после того, как я загрузил их субизображения из их листов, чтобы игра выглядела лучше и меньше масштабировалась / перекашивалась.

person Steven Landow    schedule 15.04.2015
comment
меньше чего? пожалуйста, дополните - person Jonno; 02.09.2016
comment
Этот ответ был написан более года назад, поэтому сделанное мной редактирование - это только то, что, как я полагаю, я имел в виду в то время. - person Steven Landow; 22.11.2016