Tratando de obtener el tamaño de visualización de una imagen en un ImageView

Estoy tratando de obtener el tamaño real de una imagen que se muestra en una vista de imagen. En realidad mi imagen es más grande que la pantalla y la imagen está cambiando el tamaño de la imagen para reproducirla. Estoy buscando este nuevo tamaño.

He intentado anular el método onDraw del ImageView en una vista personalizada, pero no estoy recibiendo la altura y el ancho correctos …

public class LandImageView extends ImageView { public LandImageView( Context context ) { super( context ); } public LandImageView(Context context, AttributeSet attrs) { super(context, attrs); } public LandImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw( Canvas canvas ) { super.onDraw( canvas ); int test = this.getWidth(); int test2 = this.getHeight(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } } 

¿Tiene alguna pista?

Ninguna de las respuestas aquí responde a la pregunta:

A partir de un Bitmap de Bitmap de cualquier tamaño que muestre un ImageView , busque las dimensiones reales de la imagen visualizada en comparación con las dimensiones del Bitmap suministrado.

A saber:

  • Utilizando ImageView.getDrawable().getInstrinsicWidth() y getIntrinsicHeight() devolverán las dimensiones originales.
  • Obtener el Drawable través de ImageView.getDrawable() y convertirlo en un BitmapDrawable , a continuación, utilizando BitmapDrawable.getBitmap().getWidth() y getHeight() también devuelve la imagen original y sus dimensiones.

La única forma de obtener las dimensiones reales de la imagen visualizada es extrayendo y utilizando la Matrix transformación utilizada para mostrar la imagen tal como se muestra. Esto debe hacerse después de la etapa de medición y el ejemplo aquí muestra que se llama en un Override de onMeasure() para un Custom ImageView :

 public class SizeAwareImageView extends ImageView { public SizeAwareImageView(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // Get image matrix values and place them in an array float[] f = new float[9]; getImageMatrix().getValues(f); // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) final float scaleX = f[Matrix.MSCALE_X]; final float scaleY = f[Matrix.MSCALE_Y]; // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) final Drawable d = getDrawable(); final int origW = d.getIntrinsicWidth(); final int origH = d.getIntrinsicHeight(); // Calculate the actual dimensions final int actW = Math.round(origW * scaleX); final int actH = Math.round(origH * scaleY); Log.e("DBG", "["+origW+","+origH+"] -> ["+actW+","+actH+"] & scales: x="+scaleX+" y="+scaleY); } } 

Nota: Para obtener la Matrix transformación de imagen del código en general (como en una Activity ), la función es ImageView.getImageMatrix() – por ejemplo, myImageView.getImageMatrix()

Extendí la respuesta de BT para producir un método estático de ella, e incluir la imagen de la izquierda y las posiciones superiores en el ImageView:

 /** * Returns the bitmap position inside an imageView. * @param imageView source ImageView * @return 0: left, 1: top, 2: width, 3: height */ public static int[] getBitmapPositionInsideImageView(ImageView imageView) { int[] ret = new int[4]; if (imageView == null || imageView.getDrawable() == null) return ret; // Get image dimensions // Get image matrix values and place them in an array float[] f = new float[9]; imageView.getImageMatrix().getValues(f); // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) final float scaleX = f[Matrix.MSCALE_X]; final float scaleY = f[Matrix.MSCALE_Y]; // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) final Drawable d = imageView.getDrawable(); final int origW = d.getIntrinsicWidth(); final int origH = d.getIntrinsicHeight(); // Calculate the actual dimensions final int actW = Math.round(origW * scaleX); final int actH = Math.round(origH * scaleY); ret[2] = actW; ret[3] = actH; // Get image position // We assume that the image is centered into ImageView int imgViewW = imageView.getWidth(); int imgViewH = imageView.getHeight(); int top = (int) (imgViewH - actH)/2; int left = (int) (imgViewW - actW)/2; ret[0] = left; ret[1] = top; return ret; } 

Encontré que la sugerencia de WarrenFaith de usar setAdjustViewBounds funcionó, pero tuve que cambiar el layout_width / layout_height de ImageView a 'wrap_content' (con 'match_parent', setAdjustViewBounds no hizo nada). Para obtener el comportamiento de altura / anchura / gravedad que quería, tuve que envolver el ImageView en un FrameLayout:

 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:scaleType="fitCenter" android:adjustViewBounds="true" /> </FrameLayout> 

Después de hacer esto, las dimensiones de ImageView (como devueltas por getWidth () y getHeight ()) coincidían con el tamaño de visualización de la imagen.

Tratar

 ImageView.getDrawable().getIntrinsicHeight() ImageView.getDrawable().getIntrinsicWidth() 

Estoy de paso, pero espero que siga ayudando Voy bajo el supuesto de que estás hablando de mapas de bits en tu imagenVer

Lo que quieres entender es la diferencia entre

bmpBack.getWidth() -> esto le da el tamaño de su mapa de bits y bmpBack.getScaledWidth(canvas) ; -> esto le dará el tamaño del mapa de bits como se muestra en la pantalla.

Nunca utilicé ImageView porque la pantalla relativa me estaba volviendo loca así que al final acabo de anular el onDraw e hizo mi lienzo muy similar a opengl.

Creo que este es tu problema

aclamaciones

Jason

Intente sobrescribir onMeasure(int widthMeasureSpec, int heightMeasureSpec) lugar de onSizeChanged.

Si te consigo correctamente necesitas tu dimensión de ImageView, para poder escalar tu imagen en consecuencia. Hice esto con una clase de encargo, donde onMeasure() llamada de onMeasure() para conseguir anchura y la altura.

 class LandImageView extends ImageView{ public LandImageView (Context context, AttributeSet attrs) { super (context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec); final int height = MeasureSpec.getSize(heightMeasureSpec); Log.v("", String.format("w %dh %d", width, height)); // width and height are the dimensions for your image // you should remember the values to scale your image later on this.setMeasuredDimension(width, height ); }} 

En onMeasure obtendrá el ancho y la altura de su imagen para que se ajuste a su vista.

Puede utilizar el LandImageView en su diseño como este:

 <my.package.LandImageView ... > 
 public class images extends Activity { ImageView i1; LinearLayout l1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); i1=(ImageView)findViewById(R.id.iv); l1 = new LinearLayout(this); ImageView i = new ImageView(this); ImageView i1 = new ImageView(this); i.setImageResource(R.drawable. imagename.........); l1.addView(i); l1.addView(i1); setContentView(l1); } } 

Primero agregue las imágenes en la carpeta de recursos ur ……. y en el archivo xml crear una vista de imagen ….

Estaba buscando una solución para establecer la dimensión de la vista de imagen en la imagen escalada para evitar que el espacio vacío en la parte superior / inferior o izquierda / derecha (causa la dimensión de la vista no cambia para ajustarse a la imagen escalada).

Lo que encontré para hacer el truco fue utilizando el método mImageView.setAdjustViewBounds(true); Que da como resultado la dimensión de disposición correcta. No tengo la dimensión de imagen escalada, pero tengo el resultado que estaba buscando … sólo si alguien lo necesita …

Intente cargar su recurso utilizando BitmapFactory.decodeResource (Resources res, id int, BitmapFactory.Options opts) con la clase BitmapFactory.Options (). BitmapFactory.Options() tiene un indicador que llama "inJustDecodeBounds" y proporciona sólo las dimensiones del recurso.

Espero que ayudó.

¿Qué tal ImageView.getBackground () o ImageView.getDrawable (), entonces Drawable.getBounds ()?

  • Limpiar el lienzo con Canvas.drawColor ()
  • Dibujo sobre lienzo fuera del método onDraw ()
  • ¿Cómo establecer el tamaño de la lona?
  • Por qué mi invocación de Canvas.drawText () simplemente no funciona
  • Cómo dibujar Arco entre dos puntos en el lienzo?
  • Android: ¿Cómo usar el método onDraw en una clase que extiende Actividad?
  • Flash en un WebView de Android - problema de capas
  • problemas con Android FrameLayout cuando override onDraw
  • ¿Cómo animar gradiente?
  • Android SweepGradient
  • Android - calcular el ángulo del arco
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.