2012-01-24 13 views

Respuesta

-2

simplemente convertir el dibujable en un objeto de mapa de bits:

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

esto solo da el ancho y la altura del Drawable, pero quiero el rectángulo que rodea al Drawable. – ipman

+0

¿Puedes explicar mejor a qué te refieres? ¿Te refieres a la distribución de ImageView? – Andreas

+0

No, quiero decir, a veces ImageView tiene algo de espacio entre sus límites y Drawable en ImageView. No quiero incluir este espacio en mi rectángulo. – 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(); 

Ahora que tenemos un rectángulo.

+7

esto da el rectángulo que rodea ImageView, pero quiero el rectángulo que rodea el Drawable en ImageView. – ipman

0

No lo he intentado, me vino a la mente al leer su pregunta. ¿Qué tal esto?

Digamos que ImageView no tiene relleno y la gravedad está centrada. El problema es que no se puede usar el ancho y alto del Drawable para calcular la posición del rectángulo, ya que se puede cambiar el tamaño para que se ajuste a ImageView. Entonces debe usar las dimensiones de ImageView y la proporción de ImageView y Drawable.

Cuando la relación del Drawable y el ImageView es igual, el Drawable llena el ImageView por completo y luego el rectángulo coincide con las dimensiones del ImageView. Las coordenadas del rectángulo son (desde la esquina superior izquierda, contador sabio): (0/0), (ancho ImageView/0), (ancho ImageView, altura ImageView), (0/altura ImageView),

Cuando el las proporciones no coinciden y digamos, por ejemplo, que el Drawable es más ancho que el ImageView, entonces el Drawable cubrirá el ancho completo de ImageView, pero no completará la altura. Pero a medida que el Drawable se centra, podemos calcular la coordenada y de la esquina superior izquierda Drawables y, por lo tanto, para el rectángulo. Primero calcule la altura actual del Drawable en ImageView. Esto debe hacerse como Drawable doesn ' t tiene sus dimensiones originales, ya que se redimensionó para adaptarse a la ImageView.

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

y valor de la coordenada de la esquina superior izquierda:

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

Así las coordenadas del rectángulo son (desde la esquina superior izquierda, el contador del reloj): (0 a/a), (ancho ImageView/y), (ancho ImageView/y + altura actual Drawable), (0/y + altura actual Drawable)

Espero que entienda la idea. Si el Drawable es más alto que ImageView, puede calcularlo de la misma manera, pero tiene que intercambiar los valores de ancho y alto.

0

Depende del tipo de escala que la vista de la imagen aplique al dibujable, tiene que hacer ingeniería inversa sobre el método "configureBounds()" de la clase 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).

por ejemplo, que cuando necesito la posición de la imagen para un tipo de escala central (creo que es más fácil que los otros porque la vista de la imagen no se escala la imagen) hago la inversa de:

(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); 

Y con esta información deberías poder crear el rectángulo, sé que esto es un poco complicado pero funciona para mí.

+0

¿Has entendido la parte del 0.25f? ¿Por qué crees que tiene que ver con la densidad, si todo está aquí en píxeles? –

Cuestiones relacionadas