Bild wird nicht skaliert?^

L

Lucid85

Neues Mitglied
0
^hi, ich bins mal wieder :)

folgende frage: in meinem android spiel verwende ich einige bilder, die ich für verschiedene displaygrößen
auch in die verschiedenen ordner (drawable-small etc.) abgelegt habe. nur das hintergrund bild liegt im normalen
drawable ordner und ich skaliere es dynamisch in der setSurfaceSize()-methode meines surfaceviews...

hierfür benutze ich die beiden methoden von den android-developer-seiten:
Loading Large Bitmaps Efficiently | Android Developers

der aufruf in meiner setsurfacesize()-methode sieht dann wie folgt aus:
bgImage = decodeSampledBitmapFromResource(getResources(), R.id.beach, width, height));

allerdings wird das bild irgendwie nicht skaliert sondern so genommen - das heißt,
bei kleinen displays werden einfach die ränder abgeschnitten...?

jemand ne idee, woran das liegen könnte?

danke :)
 
Hallo,

jo, das kann das System nicht gewährleisten. Selbst wenn es "funktionieren" würde, kann ich nur dringend von dieser Methode Bilder zu skalieren abraten. Jedenfalls bei Spielen, da die Skalierung hiermit nur näherungsweise erfolgt. In Realität sind die Density-Werte nicht nur auf drei oder vier Vorgaben beschränkt. Dementsprechend ungenau kann das Ergebnis der Darstellung dann werden.
Generell kann man die Dimensionsvorlagen der Assets (drawable-hdpi, xhdpi, usw..) vergessen wenn es um Spiele geht.
Meine Empfehlung:
Am besten alles was du an Bildern hast, was im Spiel (also auf dem Canvas) darstellt wird, aus den Ordnern (hdpi,...) löschen und nur in einen "normalen" drawable Ordner einfügen - in einer(!) Größe. Falls der Ordner drawable noch nicht existiert -> einen solchen erstellen.
Jetzt lädst du die Ressourcen aus diesem Ordner und skalierst diese per Code. Wichtig: den genauen Density-Wert (Faktor) abrufen.

Code:
Bitmap originalBitmap = BitmapFactory.decodeResource(gameView.getResources(), R.drawable.test_sprite);
        if (gameView.getSpriteList().size() == 1) {
            originalBitmap = BitmapFactory.decodeResource(gameView.getResources(), R.drawable.test_sprite_reversed);
        }

        resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, textureWidth * [B]getResources().getDisplayMetrics().density[/B], textureHeight * [B]getResources().getDisplayMetrics().density[/B], false);
        BitmapShader bitmapShader = new BitmapShader(resizedBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setAntiAlias(true);
        paint.setShader(bitmapShader);

Der Code könnte dir bekannt vorkommen...
 
mmmhh... bin gerade nicht zuhause...

aber ich weiß, dass als ich das mit Bitmap.createScaledBitmap(...) versucht hatte, es auf etlichen smartphones (speziell samsung-geräte) nicht lief...

da kam dann oft sowas:

05-10 05:36:19.420: E/AndroidRuntime(949): FATAL EXCEPTION: main
05-10 05:36:19.420: E/AndroidRuntime(949): Process: de.lucid.balloondart, PID: 949
05-10 05:36:19.420: E/AndroidRuntime(949): java.lang.OutOfMemoryError
05-10 05:36:19.420: E/AndroidRuntime(949): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-10 05:36:19.420: E/AndroidRuntime(949): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:575)
05-10 05:36:19.420: E/AndroidRuntime(949): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:410)

!?!?! :/
 
Hmm, an den Samsung Geräten wirds nicht liegen...
Ich teste mein Spiel selbst mit einem S2 (GT9100), einem S4 Mini (GT9195) und mit einem LG G3 (D855)... keins der Geräte hatte Probleme.
Wenn du deinen Code schickst, schaue ich gerne mal nach wo der Fehler liegen könnte.
Mögliche Fehlerquellen:
-falsches Dateiformat (sollte aber angezeigt werden)
-zu große Dateien / Auflösung (meine PNGs haben 128x128 bzw 256x256)
-zu viele Dateien
-IDE...
-ein Speicherleck
-und mehr^^

ggf. aktiviere mal die Hardwarebeschleunigung für den Canvas. Vielleicht bringts was ;)
 
mmmh... nur mein hintergrungbild ist größer: 1417x1063 - damit es halt auch bei größeren tablets passt - muss es dann also auch...?

das habe ich immer geladen und darauf dann diese createScaledBitmap()-methode angewendet. genau das führte dann oft zur o.g. fehlermeldung. seitdem ich den code von der android-seite nehme, ist der fehler verschwunden - aber es skaliert halt nicht...=
 
Hmm, das mit dem Hintergrund passt schon, der ist ja nicht mehrfach zur gleichen Zeit geladen/im Speicher. Andere Frage ist noch wie du deine Ressourcen benannt hast. Großbuchstaben können auch Probleme bereiten.
Vielleicht rufst du auch die decode-Methode an der falschen Stelle auf. OnSurfaceCreated wäre zB ein geeigneter Zeitpunkt.
 
gucke ich morgen mal...

...oder kann das an den min/target-sdkversionen liegen? verwende da 3/8 - sollte ich die erhöhen?

warum ist der genaue density-wert so wichtig?
 
Könnte an der API-Version liegen - aber wissen tue ich es nicht..
Density = Pixeldichte.
Kannst ja mal ein kariertes Blatt mit normalem Karomuster und ein Millimeterpapier bemalen.
"5 Kästchen nach rechts" sind zwei komplett unterschiedliche Abbildungen (beim Millimeterpapier wäre der Strich viel kürzer).
Deswegen multipliziert man mit dem Density-Faktor um immer im Verhältinis zur Pixelanzahl gleiche Werte gewährleisten zu können.
ALLES muss mit Density verrechnet werden. Auch die Geschwindigkeit, mit der sich der Sprite / Gegner / Kugeln / etc über den Bildschirm bewegen, ist abhängig vom Density-Faktor.
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
10
Aufrufe
220
swa00
swa00
B
Antworten
6
Aufrufe
1.051
jogimuc
J
SaniMatthias
Antworten
19
Aufrufe
955
swa00
swa00
Zurück
Oben Unten