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:
- Establezca el ancho máximo de ImageView como porcentaje del ancho de su padre
- La aplicación se bloquea al agregar un ImageView
- Android imageview toma espacio extra negro
- Obtener imagen asociada (Drawable) en ImageView android
- Necesita ayuda para mostrar el texto del mensaje con imágenes como una lista
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!
- Cómo cambiar dinámicamente la altura de ImageView
- Cómo borrar ImageView correctamente?
- Android ImageView no está mostrando la imagen?
- Cómo crear una imagen giratoria controlada por gestos para una interfaz de usuario
- Escala de imagen para rellenar el ancho de ImageView y mantener la relación de aspecto
- Escala de ImageView al ancho del dispositivo
- Cómo almacenar y recuperar el mapa de bits en sharedPreferences en Android?
- Seleccione una parte de la imagen en ImageView y obtenga los puntos finales del rectángulo seleccionado
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á.