1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Canvas Bitmap Problem

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von error, 21.06.2011.

  1. error, 21.06.2011 #1
    error

    error Threadstarter Gewerbliches Mitglied

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    21.06.2011
    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)
     
  2. ko5tik, 22.06.2011 #2
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Poste mal deine Souirces - XML Layouts and was du mit Bitmap im Java machst
     
  3. error, 22.06.2011 #3
    error

    error Threadstarter Gewerbliches Mitglied

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    21.06.2011
    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
     
  4. wilco, 22.06.2011 #4
    wilco

    wilco Android-Hilfe.de Mitglied

    Beiträge:
    106
    Erhaltene Danke:
    32
    Registriert seit:
    10.08.2010
    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.
     
  5. funcoder, 23.06.2011 #5
    funcoder

    funcoder Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    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.
     
  6. error, 23.06.2011 #6
    error

    error Threadstarter Gewerbliches Mitglied

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    21.06.2011
    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
     
  7. error, 23.06.2011 #7
    error

    error Threadstarter Gewerbliches Mitglied

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    21.06.2011
    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
     
  8. funcoder, 23.06.2011 #8
    funcoder

    funcoder Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    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?
     
  9. error, 23.06.2011 #9
    error

    error Threadstarter Gewerbliches Mitglied

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    21.06.2011
    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....
     
  10. wilco, 23.06.2011 #10
    wilco

    wilco Android-Hilfe.de Mitglied

    Beiträge:
    106
    Erhaltene Danke:
    32
    Registriert seit:
    10.08.2010
    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()).
     
  11. error, 24.06.2011 #11
    error

    error Threadstarter Gewerbliches Mitglied

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    21.06.2011
    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: 26.06.2011

Diese Seite empfehlen