2015-04-15 52 views
2

我知道android會自動縮放通過dpi加載res/drawable的Bitmaps。當我爲我的遊戲加載資源時,我使用BitmapFactory選項手動關閉它,例如tileset。哪些Canvas和Bitmap方法可通過dpi(Android)進行縮放?

//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(); 
    } 
} 

問題是,當我把它們畫到我的畫布(然後吸引到從表面上看),如果我考的比MDPI瓷磚縮放與間距太小下任何DPI的遊戲,如果我對任何高於他們繪製得太大和重疊的東西進行測試。

主要問題是什麼方法使用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

這是華電國際,注意的事情是如何超標度和重疊瓷磚畫前,他們 http://cdn.img42.com/540b7896947049250fea3f3fa5a08331.png

這是LDPI,注意瓷磚如何太小,他們留出空間,其間 img42/420e938b3eebc503247cd0181b779402fe.png

+0

'Canvas.drawBitmap()'方法**不要**縮放位圖,他們繪製它1:1 – pskink

+0

這就是我的想法,但我不明白爲什麼它只看起來正確的mdpi設備。我想知道的主要是自動縮放位圖的方法。 –

+0

BitmapFactory.decodeResource()例如,但你禁用了你沒有嗎? – pskink

回答

1

我想通了。我讀了帆布的文檔,我有當他們被調用

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

我也可以設置所有圖像的像素密度回到系統像素密度後我加載他們的subimages出他們的表,使遊戲看起來更好,縮小/歪斜

+0

少了些什麼?請詳細說明 – Jonno

+0

這個答案是一年前寫的,所以我做的編輯只是我當時所說的我的意思。 –

相關問題