2016-08-03 10 views
1

Ich bin ein Anfänger in Android Studio, und von allem bin ich besonders verwirrt in Aufgaben im Zusammenhang mit BitmapFactory.BitmapFactory getWidth() getHeight() und Pixel von der tatsächlichen Bildgröße unterscheiden sich

Das Problem, das ich habe, ist wie folgt. Wenn ich eine JPG-Datei mit Dimension (578x496) unter ziehbar Ordner einzufügen, und ich tun, um diese

Bitmap mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.background1)); 
Log.e("WIDTH", String.valueOf(mBitmap.getWidth()); 
Log.e("HEIGHT", String.valueOf(mBitmap.getHeight()); 

Was ich bekommen, ist eine Dimension von (2312x1984), die genau x4 größer als die tatsächliche Dimension. Liegt es daran, dass ich das Dateiformat als jpg und nicht als png habe?

So was habe ich mich entschlossen war

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 4; 
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.background1,options)); 

zu tun, und setzen Sie ihn dann als Hintergrund meiner Surface durch,

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback { 
    public static final int WIDTH=578; 
    public static final int HEIGHT=496; 
    .... 
    @Override 
    public void draw(Canvas canvas){ 
    final int scaleXFactor = getWidth()/WIDTH; 
    final int scaleYFactor = getHeight()/HEIGHT; 

    if(canvas!=null){ 
     final int savedState = canvas.save(); 
     canvas.scale(scaleXFactor,scaleYFactor); 
     bg.draw(canvas); 
     canvas.restoreToCount(savedState); 
    } 

} 

aber canvas.scale (scaleXFactor, scaleYFactor) erlauben nur die Hintergrund passt horizontal, aber nicht vertikal. So ist es wie

--------------------------------------  
|    IMG     | 
|          | 
|-------------------------------------| <-Viewed as "Landscape" 
|   Black Empty Screen   | 
|          | 
|-------------------------------------|    

Mein Verständnis so weit ist, dass Bitmap ist wirklich wichtiges Konzept in allen Arten von Anwendungen von Android Studio gemacht, und wenn sie nicht richtig umgesetzt, verursacht es Anwendung durch OOM Fehler zum Absturz zu bringen oder einfach langsam nach unten die Anwendung. Bitte werfen Sie mir ein Licht auf diesen armen Mann, Experten da draußen.

+0

Dies liegt daran, dass Sie decodeResource() aus dem Drawable-Ordner verwenden. Ein Bild wird dann für das Gerät angepasst. Wie ist die Auflösung des Bildschirms? Obwohl ich es seltsam finde, dass es so groß wird. Stellen Sie Ihr Bild in den Ordner "Assets" und verwenden Sie die Dekodierung aus dem Stream oder so. – greenapps

+0

@greenapps Sie waren richtig, dass es automatisch die Größe der Bitmap skaliert und skaliert mit der Auflösung des Bildschirms. Ich lege Ressourcen in den Ordner "Assets" und es funktioniert, obwohl ich nicht auf diese Weise suche –

+0

Haben Sie einen anderen Vorschlag dabei, so dass das Bild nicht automatisch skaliert wird? Ich schätze wirklich Ihre Eingabe Mann –

Antwort

1

Wenn Sie ein Bild in /res/drawable oder /res/drawable-mdpi Ordner, und Sie rufen BitmapFactory.decodeResource() auf einem Gerät mit xxxhdpi Dichte, BitmapFactory wird die Bitmap für Sie skalieren, so dass, wenn Sie es auf dem Bildschirm xxxhdpi angezeigt werden, es proportional aussehen das gleiche wie auf einem Bildschirm mit geringerer Dichte.

Wenn Sie entschieden haben, dass Sie wirklich nicht wollen, dass dies geschieht, legen Sie das Bild in den Ordner /res/drawable-nodpi. Dann wird es auf jeder Plattform in der gleichen Größe dekodieren. Das Bild wird jedoch bei der Anzeige unterschiedlicher Density-Geräte sehr unterschiedlich aussehen.

+0

Vielen Dank für Ihre Antwort! Ich habe das unter -nodpi-Ordner abgelegt und das Größenproblem ist anders. (Ich weiß, es ist nur eine vorübergehende Lösung auf diese Weise). Also, wenn ich andere Dichten wie "xxxdpi" möchte, muss ich die Auflösung des Bildes höher erhöhen oder sonst wird es für mich in einer unerwünschten Weise die Größe ändern? –

+0

Ich hätte Ihren Code genauer betrachten sollen. Wenn Sie 'scaleXFactor = getWidth()/WIDTH' ausführen, und ich nehme an, dass die Breite Ihres' SurfaceView's 578dp ist, behandeln Sie die Dichte selbst. Ich wette, die Breite deiner Ansicht ist 2312 oder 4 * 578. Also skalierst du die Leinwand und zeichnest dann das Bild mit der Dichte - ** in ** abhängig nodpi decode, aber das ist nicht anders, wenn du * nicht * Rufen Sie 'canvas.scale()' auf und zeichnen Sie dann das Bild mit der dichteabhängigen Dekodierung, mit der Sie begonnen haben. Im ersten Fall skalieren Sie beim Zeichnen, im zweiten Fall skalieren Sie beim Dekodieren. Das Endergebnis ist unabhängig davon gleich. –