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?

Mi ImageView tiene un método Init donde crear el 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 layout oder measure necesito las dimensiones exactas de Drawable para ajustar el resto de mis componentes a su alrededor.

coverImg.getHeight() y coverImg.getMeasuredHeight() no devuelven los resultados que necesito y si utilizo coverImg.getDrawable().getBounds() obtengo las dimensiones antes de que fuera escalada por ImageView.

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

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

Llame getIntrinsicHeight y getIntrinsicWidth en el drawable.

 public int getIntrinsicHeight () 

Desde: API Nivel 1

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

 public int getIntrinsicWidth () 

Desde: API Nivel 1

Devuelve el ancho intrínseco del objeto dibujable subyacente.

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

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

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

La manera más confiable y poderosa de obtener dimensiones extraíbles para mí ha sido usar BitmapFactory para decodificar un mapa de bits. Es muy flexible: puede decodificar imágenes de un recurso extraíble, archivo u otras fuentes diferentes.

A continuación se muestra cómo obtener las 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 utiliza carpetas con varias densidades en res y asegúrese de especificar inTargetDensity en su BitmapFactory.Options para obtener la densidad deseada.

Esto resolvió mi problema. Descodifica el tamaño del límite de la imagen sin realmente cargar 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; 

Manera eficiente de obtener Anchura 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á.

  • Gire la vista de imagen alrededor de su centro sin cortar sus bordes
  • Cómo encontrar la intersección entre dos ImageView cuando arrastrar y soltar?
  • ImageView muestra espacio en blanco en la parte superior e inferior de la imagen
  • ¿Por qué el Ancho / Altura del dibujable en ImageView equivocado?
  • Cambiar la posición de la vista de la imagen
  • Android - ViewRootImpl $ CalledFromWrongThreadException
  • Establecer margen negativo en ImageView cambia ImageView pero no Image
  • Estirar imagen en ImageView
  • Android.view.InflateException: al escribir una imagen personalizada
  • Android agrega programaticamente ImageView
  • Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.