¿Cómo obtener las dimensiones de un Drawable en un ImageView?

¿Cuál es la mejor manera de recuperar las dimensiones del Drawable en un ImageView?

My ImageView tiene un Init-Method donde creo ImageView:

private void init() { coverImg = new ImageView(context); coverImg.setScaleType(ScaleType.FIT_START); coverImg.setImageDrawable(getResources().getDrawable(R.drawable.store_blind_cover)); addView(coverImg); } 

En algún momento durante el proceso de diseño y medición, necesito las dimensiones exactas del Drawable para ajustar el rest de mis componentes a su alrededor.

coverImg.getHeight() y coverImg.getMeasuredHeight() no devuelven los resultados que necesito y si uso coverImg.getDrawable().getBounds() obtengo las dimensiones antes de que coverImg.getDrawable().getBounds() lo escalara.

¡Gracias por tu ayuda!

Acabo de probar esto y funciona para mí:

 int finalHeight, finalWidth; final ImageView iv = (ImageView)findViewById(R.id.scaled_image); final TextView tv = (TextView)findViewById(R.id.size_label); ViewTreeObserver vto = iv.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { // Remove after the first run so it doesn't fire forever iv.getViewTreeObserver().removeOnPreDrawListener(this); finalHeight = iv.getMeasuredHeight(); finalWidth = iv.getMeasuredWidth(); tv.setText("Height: " + finalHeight + " Width: " + finalWidth); return true; } }); 

ViewTreeObserver le permitirá monitorear el diseño justo antes de dibujarlo (es decir, todo ya se ha medido) y desde aquí puede obtener las medidas a escala de ImageView .

Llame a getIntrinsicHeight y getIntrinsicWidth en el drawable.

 public int getIntrinsicHeight () 

Desde: Nivel de API 1

Devuelve la altura intrínseca del objeto dibujable subyacente. Devuelve -1 si no tiene una altura intrínseca, como con un color sólido.

 public int getIntrinsicWidth () 

Desde: Nivel de API 1

Devuelve el ancho intrínseco del objeto dibujable subyacente.

Devuelve -1 si no tiene ancho intrínseco, como con un color sólido.

http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight ()

Este es el tamaño del dibujo original. Creo que esto es lo que quieres.

La forma más confiable y poderosa de obtener dimensiones dibujables para mí ha sido utilizar BitmapFactory para decodificar un bitmap. Es muy flexible: puede decodificar imágenes de un recurso dibujable, un archivo u otras fonts diferentes.

A continuación se detalla cómo obtener dimensiones de un recurso dibujable con BitmapFactory:

 BitmapFactory.Options o = new BitmapFactory.Options(); o.inTargetDensity = DisplayMetrics.DENSITY_DEFAULT; Bitmap bmp = BitmapFactory.decodeResource(activity.getResources(), R.drawable.sample_image, o); int w = bmp.getWidth(); int h = bmp.getHeight(); 

Tenga cuidado si usa varias carpetas dibujables de densidad bajo res, y asegúrese de especificar InTargetDensity en su BitmapFactory.Options para obtener el dibujable de la densidad que desea.

Manera eficiente de obtener ancho y altura de Drawable :

 Drawable drawable = getResources().getDrawable(R.drawable.ic_home); int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Log.i("Drawable dimension : WH", width+"-"+height); 

Espero que esto te ayudará.

esto resolvió mi problema Decodifica el tamaño del límite de la imagen sin cargar realmente toda la imagen.

 BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.img , o); int w = o.outWidth; int h = o.outHeight;