2012-01-24 17 views

risposta

-2

semplicemente convertire drawable in un oggetto bitmap:

Bitmap bmp = ((BitmapDrawable)dr).getBitmap(); 
int w = bmp.getWidth(); 
int h = bmp.getHeight(); 
+3

questo dà solo la larghezza e l'altezza del Drawable, ma voglio il rettangolo che circonda il Drawable. – ipman

+0

puoi spiegare meglio cosa intendi? Intendi il layout fuori da ImageView? – Andreas

+0

No Voglio dire, a volte ImageView ha uno spazio tra i suoi limiti e Drawable in ImageView. Non voglio includere questa spaziatura nel mio rettangolo. – ipman

4
Rect rect = new Rect(); 
    ImageView iV = new ImageView(); 

    rect.left = iV.getLeft(); 
    rect.top = iV.getTop(); 
    rect.bottom = iV.getBottom(); 
    rect.right = iV.getRight(); 

Ora avete il vostro rettangolo.

+7

questo dà il rettangolo che circonda ImageView, ma voglio il rettangolo che circonda il Drawable in ImageView. – ipman

0

Non ho provato questo, mi è venuto in mente quando ho letto la tua domanda. Che dire di questo.

Diciamo che ImageView non ha padding e la gravità è impostata al centro. Il problema è che non è possibile utilizzare la larghezza e l'altezza del Drawable per calcolare la posizione del rettangolo poiché potrebbe ridimensionarsi per adattarsi a ImageView. Quindi devi usare le dimensioni di ImageView e il rapporto di ImageView e Drawable.

Quando il rapporto di Drawable e ImageView è uguale, il Drawable riempie completamente ImageView e quindi il rettangolo corrisponde alle dimensioni di ImageView. Le coordinate del rettangolo sono (dall'angolo in alto a sinistra, contatore saggio): (0/0), (larghezza ImageView/0), (larghezza ImageView, altezza ImageView), (0/altezza ImageView),

Quando il i rapporti non corrispondono e diciamo per esempio che il Drawable è più largo di ImageView, quindi il Drawable riempirà la larghezza completa di ImageView ma non riempirà l'altezza. Ma mentre il Drawable si centra, possiamo calcolare la coordinata y dei Drawables nell'angolo in alto a sinistra e quindi per il rettangolo. Calcola innanzitutto l'altezza corrente del Drawable in ImageView. Questo deve essere fatto poichè Drawable non ha le sue dimensioni originali dato che è stato ridimensionato per adattarsi a ImageView.

current height Drawable = (Drawable height/Drawable width) * ImageView width 

valore y del punto dell'angolo superiore sinistro:

y = (ImageView height - Drawable current height)/2 

Quindi le coordinate del rettangolo sono (da alto a sinistra, contrastare saggio): (0/y), (larghezza ImageView/y), (larghezza ImageView/y + altezza corrente Drawable), (0/y + altezza corrente Drawable)

Spero che tu abbia l'idea. Se il Drawable è superiore a ImageView, puoi calcolarlo allo stesso modo, ma devi scambiare i valori di larghezza e altezza.

0

Dipende dal tipo di scala che la vista dell'immagine si applica al drawable, è necessario eseguire l'ingegneria inversa tramite il metodo "configureBounds()" della classe ImageView (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/widget/ImageView.java#ImageView.configureBounds%28%29).

per esempio io quando ho bisogno la posizione dell'immagine per un tipo di scala centrale (penso che sia più facile rispetto agli altri perché la vista dell'immagine non scala dell'immagine) che faccio l'inverso di:

(mDrawMatrix.setTranslate((int) ((vwidth - dwidth) * 0.5f + 0.5f), 
         (int) ((vheight - dheight) * 0.5f + 0.5f));) 

ImageView iv (Your ImageView); 
    Drawable dw = iv.getDrawable(); 

    int dwidth = dw.getIntrinsicWidth(); 
    int dheight = dw.getIntrinsicHeight(); 

    int vwidth = iv.getWidth() - iv.getPaddingLeft() - iv.getPaddingRight(); 
    int vheight = iv.getHeight() - iv.getPaddingTop() - iv.getPaddingBottom(); 

    int realImageWidth = (int)((vwidth - dwidth) * 0.25f); 
    // (I do not know why I had to put 0.25f instead of 0.5f, 
    // but I think this issue is a consequence of the screen density) 

    int realImageHeight = (int)((vheight - dheight) * 0.25f); 

E con questi dati dovresti essere in grado di creare il rettangolo, so che questo è un po 'complicato ma funziona per me.

+0

Hai capito la parte di 0.25f? Perché pensi che abbia a che fare con la densità, se tutte le cose qui sono in pixel? –

Problemi correlati