Canvas Bitmap Problem

E

error

Neues Mitglied
0
Hallöchen Freunde des günen Manschgals! :)


Ich war bisher nur leser von android-hilfe.de
Jedoch komme ich jetzt mit lesen (inkl. google) nicht weiter

hier mein Problem:

Ich bin stolzer Besitzer eines Nexus S's und entwickle darauf schon ein paar Wochen. (Auflösung: 480x800)
Wenn ich nun eine bmp-datei mit 480x480 in eine imageview packe, sieht das ganze sehr gut aus.
wenn ich jedoch das ganze mit canvas und drawBitmap versuche, is das bild um das 1,5-fache größer,
geht sozusagen aus dem rechten bildrand heraus, erst wenn ich es auf 320x320 skaliere (dynamisch oder per hand mit gimp)
schließt es mit dem rechten bildrand ab, jedoch etwas verschwommen (klar, es gehen ja etliche pixel verloren)

Ich hoffe einer von euch hat ne idee dazu, habe schon vieles ausprobiert (z.B. mit densities)
 
Poste mal deine Souirces - XML Layouts and was du mit Bitmap im Java machst
 
also gut:

mit imageview so:

<ImageView
android:src="@drawable/pic01"
android:adjustViewBounds="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

und mit canvas so:

eigenes Panel für canvas:
public class CanPanel extends SurfaceView implements SurfaceHolder.Callback{
welches ich so in einem activity einfüge:

<com.example.android.helloand.Panel
android:id="@+id/CanPanel01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxHeight="100px">
</com.example.android.helloand.Panel>


mit dessen onDraw-methode:
public void onDraw(Canvas canvas) {

Bitmap pic01 = BitmapFactory.decodeResource(getResources(),R.drawable.pic01);

canvas.drawColor(Color.BLACK);
canvas.drawBitmap(pic01, 0, 0, null);
}


wenn dir der ganze sourcecode weiterhilft, sag bescheid, dann lad ich den ganz hoch
 
Das hat mit dem Code wenig zu tun. Da schlägt die Auto-Skalierung von Android zu. Genaues dazu findest Du hier.

Pack die Grafik einfach mal in einen Folder mit dem Namen drawable-nodpi statt in den normalen drawables Folder, dann kommt sie genau so raus wie Du sie reingepackt hast.
 
Mh ersetze doch zuerstmal folgende XML-Definition für deine View:

<com.example.android.helloand.Panel
android:id="@+id/CanPanel01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>

Da deine Grafik im drawable Verzeichnis liegt, liegt es an der screen-support Option in der Android-Manifest.xml ob du möchtest, dass Android dir deine Grafik automatisch skaliert oder ob du möchtest das du dich selbst um die Skalierung kümmerst.

In deinem Falle sollte ja keine automatische Skalierung durch Android stattfinden. Folglich solltest du in der Manifest XML folgendes aufnehmen.

<supports-screens
android:resizeable="true"
android:smallScreens="true"
android:largeScreens="true"
android:normalScreens="true"
android:anyDensity="true">
</supports-screens>

Das bedeutet soviel, dass deine App für alle Screentypen funktioiert und dein Programmcode selbst um die Skalierung kümmert.

Deine Grafik kannst auf diese Weise problemlos im drawable Verzeichnis liegen lassen.
 
danke für den tipp

konnte damit aber das problem leider nicht lösen : /
das bitmap-file ins verzeichnis drawable-nodpi zu packen hat keinen unterschied gemacht

edit:
@funcoder

oh :), hab dein post gar nicht gesehen.. moment
 
so, ich habs jetzt so ausprobiert wie du es gemeint hast funcoder, jedoch wird das bild immer noch stark skaliert, ich wüsst nicht was ich falsch gemacht haben könnte nach deiner anweisung
 
Okay, langsam wird es echt merkwürdig :D

Eine Idee habe ich noch:

Rect rect = new Rect(0, 0, pic01.getWidth(), pic01.getHeight());
canvas.drawBitmap(pic01, rect, rect, new Paint());

Das recht-Objekt nimmt die Ausmaße deiner Grafik an und diese wird 2x angegeben in der drawBitmap-Methode. Beim ersten mal stellt dies die Source-Quelle dar. Also die gesamte Grafik. Beim zweiten Mal stellt diese das Target dar. Deine Canvas-Leinwand. Bei beiden male verwendet er die exakten Bitmap Ausmaße. Sollte die Skalierung immer noch erfolgen ist die automatische Skalierung von Android definitiv aktiviert und zudem die Fehlerquelle.
Lass dir zusätzlich mal die Werte von pic01.getWidth() und getHeight() wiedergeben. Entsprechen diese die realen Ausmaße der Grafik?
 
nein das hat leider auch keinen unterschied gemacht : /
die ausmaße waren 360x360, obwohl das bild 480x480 besitzt

bin schon ein wenig am verzweifeln ;)

hat einer eine alternative wie ich bitmaps mit canvas darstelle? vl. ist auch die art wie ich es tue einfach fehlerhaft....
 
Gegen welche SDK Version baust Du denn die App? Die ganzen Auto-Skalierungsoptionen haben sich mit Version 1.6 stark geändert.

Und hast Du Deine Bitmap auch aus dem regulären "drawable" Verzeichnis entfernt, d.h. sichergestellt dass sie ausschliesslich im "drawable-nodpi" zu finden ist?

Ansonsten kannst Du die Bitmap natürlich von Hand skalieren: ganz regulär Deine Bitmap erzeugen, und diese dann in eine neue skalieren über Bitmap.createScaledBitmap.

Bei sämtlichen Bitmap Operationen immer höllisch auf das Speicher-Management aufpassen. Also sobald Du eine Bitmap nicht mehr brauchst (z.B. die Quell-Bitmap nachdem Du sie in eine skalierte umgewandelt hast) per release() freigeben und nacher eine Garbage Collection antriggern (System.gc()).
 
SDK Platform Android 2.3.3, API 10, revision 1

ja, ich habe die datei vom drawable verzeichnis ins drawable-nodpi verzeichnis kopiert und dann umbenannt (im code natürlich dann auch den namen geändert)

ja, die skalierung ist nicht das problem, jedoch wird die bitmap dann verschwommen

edit:
da ich das problem nicht beheben konnte, such ich nach andere möglichkeiten.
wenn jemand noch was einfällt wäre ich sehr dankbar wenns hier gepostet wird.

danke an all eure vorschläge
 
Zuletzt bearbeitet:

Ähnliche Themen

W
  • WuDiDong
Antworten
3
Aufrufe
764
jogimuc
J
S
Antworten
4
Aufrufe
990
Sempervivum
S
A
  • Arif12
Antworten
7
Aufrufe
1.409
Jaiel
Jaiel
Zurück
Oben Unten