2012-09-17 12 views
13

Il codice è semplice:Prendi il formato visualizzato di un'immagine all'interno di un ImageView

<ImageView android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:src="@drawable/cat"/> 

Avviso l'ImageView utilizzato fill_parent per la larghezza e l'altezza.

L'immagine cat è una piccola immagine e verrà ingrandita per adattarsi a ImageView e mantenere il rapporto larghezza/altezza allo stesso tempo.

La mia domanda è come ottenere la dimensione visualizzata dell'immagine? Ho provato:

imageView.getDrawable().getIntrinsicHeight() 

Ma quali l'altezza originale dell'immagine cat.

ho provato:

imageView.getDrawable().getBounds() 

Ma che restituisce Rect(0,0,0,0).

+0

è possibile utilizzare ViewTreeObserver per ottenere le reali dimensioni di qualsiasi vista in fase di esecuzione http://developer.android.com/reference/android/view/ViewTreeObserver.html –

+0

Grazie, sto guardando. PS: è il migliore/unico modo per ottenere la taglia? – Freewind

+1

Siamo spiacenti, anche con ViewTreeObserver, non so ancora come ottenere la ** dimensione ** visualizzata dell'immagine. – Freewind

risposta

39

seguente funzionerà:

ih=imageView.getMeasuredHeight();//height of imageView 
iw=imageView.getMeasuredWidth();//width of imageView 
iH=imageView.getDrawable().getIntrinsicHeight();//original height of underlying image 
iW=imageView.getDrawable().getIntrinsicWidth();//original width of underlying image 

if (ih/iH<=iw/iW) iw=iW*ih/iH;//rescaled width of image within ImageView 
else ih= iH*iw/iW;//rescaled height of image within ImageView 

(iw x IH) ora rappresenta il reale riscalato (larghezza x altezza) dell'immagine all'interno della vista (in altre parole la dimensioni visualizzate dell'immagine)


EDIT: Penso che un modo migliore di scrivere la risposta di cui sopra (e uno che lavora con ts):

  final int actualHeight, actualWidth; 
      final int imageViewHeight = imageView.getHeight(), imageViewWidth = imageView.getWidth(); 
      final int bitmapHeight = ..., bitmapWidth = ...; 
      if (imageViewHeight * bitmapWidth <= imageViewWidth * bitmapHeight) { 
       actualWidth = bitmapWidth * imageViewHeight/bitmapHeight; 
       actualHeight = imageViewHeight; 
      } else { 
       actualHeight = bitmapHeight * imageViewWidth/bitmapWidth; 
       actualWidth = imageViewWidth; 
      } 

      return new Point(actualWidth,actualHeight); 
+0

non dimenticare di dividere int con int risulterà int. :) – abbath

+8

Mentre mi piace questa risposta, devo dire che non mi piace il tuo schema di denominazione delle variabili :( –

+0

@MattLogan L'ho modificato per avere una scrittura più carina Spero ti piaccia meglio –

-2

uso

// For getting imageview height 
imgObj.getMeasuredHeight() 


// For getting imageview width 
imgObj.getMeasuredWidth(); 


//For getting image height inside ImageView 
imgObj.getDrawable().getIntrinsicHeight(); 


//For getting image width inside ImageView 
imgObj.getDrawable().getIntrinsicWidth(); 
1

Ecco una funzione di supporto per ottenere i limiti dell'immagine in un imageView.

/** 
* Helper method to get the bounds of image inside the imageView. 
* 
* @param imageView the imageView. 
* @return bounding rectangle of the image. 
*/ 
public static RectF getImageBounds(ImageView imageView) { 
    RectF bounds = new RectF(); 
    Drawable drawable = imageView.getDrawable(); 
    if (drawable != null) { 
     imageView.getImageMatrix().mapRect(bounds, new RectF(drawable.getBounds())); 
    } 
    return bounds; 
}