2013-07-12 10 views
19

Sto provando a disegnare su ImageViewTouch, una libreria che consente lo zoom pizzico. Sono in grado di disegnare sull'immagine usando Canvas, ma quando zoomo l'immagine, il disegno scompare.IllegalArgumentException: larghezza e altezza devono essere> 0 durante il caricamento di Bitmap dalla vista

Per questo, sto provando a convertire la vista in una bitmap e impostare theImageBitmap per questa stessa vista. Ecco il codice:

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; 
} 

Quando faccio questo, ottengo il seguente errore di registro:

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) 

Se rimuovo il loadBitmapFromView chiamata il disegno normalmente appare sull'immagine. Quando provo a fare qualsiasi interazione con l'immagine (come lo zoom avanti o indietro), il disegno scompare, rimanendo solo l'immagine di sfondo, che è un'immagine.

--- EDIT ---

Ecco un po 'di codice inserito dopo la chiamata loadBitmapFromView. Il caso è: ho un ascoltatore del gruppo radio e quando controllo qualche pulsante radio, devo caricare l'immagine e disegnare alcuni possibili disegni su di esso .. quindi sto cercando di convertire tutto (l'immagine e i disegni) in solo una bitmap.

Ecco la parte Ohter del codice:

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

Dopo di che, ne traggo tutto quello che ho a disegnare e cercare di convertire la vista bitmap utilizzando il metodo loadImageBitmap ho mostrato.

il metodo decodeSampledBitmapFromResource ho ricevuto da questo link su sviluppatori di Android http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

risposta

28

Ho finalmente trovato una soluzione per il mio problema.

sto usando il metodo della vista, che verrà eseguito solo dopo la misurazione vista e interfaccia grafica, in questo modo getWidth() e getHeight() restituisce la larghezza e l'altezza effettiva post.

Ecco il codice di esempio:

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

Speranza che aiuta anche a qualcun altro :)

+1

Ciao, puoi spiegarci un po 'di più Quindi, ovunque tu imposti la tua immagine bitmap, lo metti semplicemente in un' Runnable 'come sopra e la tua larghezza e altezza non erano più problemi? – Azurespot

+0

Il codice funziona per tutte le API Android anziché per l'API 21 (lollipop). Sto lavorando con il dispositivo Samsung S4 ma anche questa riga di codice non mi è stata di aiuto. –

0

java.lang.IllegalArgumentException: width and height must be > 0 è perché nella tua Bitmap.createBitmap() chiamata v.getLayoutParams().width o v.getLayoutParams().height è 0. Probabilmente il LayoutParams sono erroneamente impostati in mImage.

Aggiornamento: setLayoutParams() per il mImage prima di utilizzare createBitmap(). Qualcosa del genere:

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

Sì .. Ho controllato, sono veramente zero .. ma perché? Sto solo passando la vista che avevo prima come parametro, ma ora questa vista ha la tela disegnata su di esso –

+0

@FelipeMosso stai passando la vista prima o dopo che è stata presentata all'utente? IIRC, se lo passi prima, allora 'getLayoutParams(). Height' e' getLayoutParams(). Width' sarà 0. – nick

+0

Sto passando prima che sia stato presentato all'utente ... perché devo presentargli tutti i disegni già disegnati Ho modificato la domanda con ulteriori informazioni, dai un'occhiata, pls :) –

4

Se tutto il resto è corretto, si sta eseguendo il codice troppo presto.

Il layout della vista non è stato ancora misurato da Android. Prova ad eseguire in OnResume solo per vedere se questo è il tuo problema.

Cheers!

+0

Posso fare quello che hai detto causa giusto prima di chiamare questo setImageBitmap che chiamo un altro. Ho modificato la domanda con altre spiegazioni! –

+0

Non capisco quando dici di provare ad eseguire in OnResume .. Ho impostato la bitmap sul radio button listener, l'attività è sempre la stessa :(potresti provare a delustrare mostrandomi un pezzo di codice? grazie! –

0

Nel mio caso, ho dimenticato di impostare orientation-vertical per il genitore LinearLayout e il valore predefinito di horizontal è stata impostato, quindi l'ho impostato e il mio problema è scomparso ...

android:orientation="vertical" 
Problemi correlati