2013-07-12 6 views
19

Ich versuche, auf ein ImageViewTouch zu zeichnen, eine Bibliothek, die das Pinch-Zoomen ermöglicht. Ich kann mit Canvas über das Bild zeichnen, aber wenn ich das Bild zoome, verschwindet die Zeichnung.IllegalArgumentException: Breite und Höhe müssen beim Laden von Bitmap> 0 sein.

Dafür versuche ich, die Ansicht in eine Bitmap zu konvertieren und die ImageBitmap für diese Ansicht festzulegen. Hier ist der Code:

mImage.setDrawPath(true); 
mImage.setImageBitmap(loadBitmapFromView(mImage)); 

public static Bitmap loadBitmapFromView(View v) { 
     Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);     
     Canvas c = new Canvas(b); 
     v.layout(0, 0, v.getWidth(), v.getHeight()); 
     v.draw(c); 
     return b; 
} 

Wenn ich das tue, erhalte ich die folgenden Protokollfehler:

07-11 21:13:41.567: E/AndroidRuntime(20056): java.lang.IllegalArgumentException: width and height must be > 0 
07-11 21:13:41.567: E/AndroidRuntime(20056): at android.graphics.Bitmap.createBitmap(Bitmap.java:638) 
07-11 21:13:41.567: E/AndroidRuntime(20056): at android.graphics.Bitmap.createBitmap(Bitmap.java:620) 

Wenn ich den loadBitmapFromView Aufruf entferne die Zeichnung normalerweise auf das Bild erscheint. Wenn ich versuche, mit dem Bild zu interagieren (z. B. durch Vergrößern oder Verkleinern), verschwindet die Zeichnung, wobei nur das Hintergrundbild, das ein Bild ist, erhalten bleibt.

--- EDIT ---

Hier einige weitere Code nach dem Aufruf loadBitmapFromView platziert. Der Fall ist: Ich habe einen Radiogruppen-Listener und wenn ich einen Radioknopf überprüfe, muss ich das Bild laden und einige mögliche Zeichnungen darüber zeichnen. Dann versuche ich alles (das Bild und die Zeichnungen) in nur zu konvertieren eine Bitmap

Hier ist der ohter Teil des Codes:

bitmap = BitmapUtils.decodeSampledBitmapFromResource(root + DefinesAndroid.CAMINHO_SHOPPINGS_SDCARD + nomeImagemAtual, size.x, size.y); 
mImage.setImageBitmap(bitmap); 

Danach habe ich alles zeichne ich habe zu ziehen und versuchen, die Ansicht zu konvertieren die loadImageBitmap Methode Bitmap mit I gezeigt haben.

die decodeSampledBitmapFromResource Methode, die ich von diesem Link auf Android-Entwickler bekam http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Antwort

28

Ich habe endlich eine Lösung für mein Problem gefunden.

Ich verwende die post Methode der Ansicht, die erst nach der Ansicht Mess- und Layouten ausgeführt werden, auf diese Weise getWidth() und getHeight() kehrt die tatsächliche Breite und Höhe.

Hier ist der Code-Beispiel:

mImage.post(new Runnable() { 
    @Override 
    public void run() { 
     mImage.setImageBitmap(loadBitmapFromView(mImage)); 
    } 
}); 

Hoffe, dass es sonst :)

+1

Hallo, können Sie ein wenig mehr erklären. Also, wo auch immer Sie Ihre Bild-Bitmap setzen, Sie nur in eine "Runnable" wie oben und Ihre Breite und Höhe waren keine Probleme mehr? – Azurespot

+0

Code funktioniert für alle Android-APIs anstelle von API 21 (Lollipop). Ich arbeite mit Samsung S4-Gerät, aber diese Codezeile hat mir auch nicht geholfen. –

0

java.lang.IllegalArgumentException: width and height must be > 0 ist, weil in Ihrem Bitmap.createBitmap() Anruf v.getLayoutParams().width oder v.getLayoutParams().height 0 ist wohl LayoutParams in mImage falsch eingestellt sind.

Aktualisierung: setLayoutParams() für die mImage vor der Verwendung createBitmap(). Etwas wie dieses:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(30, 30); 
mImage.setLayoutParams(layoutParams); 
+0

Ja .. ich habe nachgeprüft, sie sind wirklich Null .. aber warum? Ich übergebe nur die Ansicht, die ich zuvor als Parameter hatte, aber jetzt hat diese Ansicht die Leinwand darauf gezeichnet –

+0

@FelipeMosso übergeben Sie die Ansicht vor oder nachdem es dem Benutzer präsentiert wurde? IIRC, wenn du es vorher passierst, dann werden die 'getLayoutParams(). Height' und 'getLayoutParams(). Width '0 sein. – nick

+0

Ich vergehe, bevor es dem Benutzer präsentiert wurde ... weil ich ihn präsentieren muss alle Zeichnungen bereits gezeichnet. Ich habe die Frage mit mehr Informationen redigiert, werfen Sie einen Blick darauf, pls :) –

4

Wenn alles andere korrekt ist, führen Sie Ihren Code zu früh aus.

Das Layout der Ansicht wurde noch nicht von Android gemessen. Versuchen Sie in OnResume auszuführen, nur um zu sehen, ob dies Ihr Problem ist.

Prost!

+0

Ich kann tun, was Sie gesagt haben Ursache direkt vor dem Aufruf dieser setImageBitmap Ich rufe einen anderen. Ich habe die Frage mit ein paar mehr Erklärungen bearbeitet! –

+0

Ich bekomme nicht, wenn Sie sagen, versuchen, in OnResume ausführen .. Ich habe die Bitmap auf den Radio-Button ändern Listener, die Aktivität ist immer noch die gleiche :(Könnten Sie bitte versuchen, zu veranschaulichen es zeigt mir ein Stück Code? Danke! –

0

In meinem Fall auch jemand hilft, ich orientation-vertical für Eltern LinearLayout und der Standardwert von horizontal wurde eingestellt vergessen Set, also setze ich es und mein Problem ist weg ...

android:orientation="vertical" 
Verwandte Themen