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

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

Intenté anular el método onDraw de ImageView en una vista personalizada, pero no obtengo el alto 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); } } 

¿Tienes alguna pista?

    Ninguna de las respuestas aquí responde la pregunta:

    Desde un Bitmap de Bitmap de cualquier tamaño mostrado por un ImageView , encuentre las dimensiones reales de la imagen mostrada en comparación con las dimensiones del Bitmap suministrado.

    A saber:

    • El uso de ImageView.getDrawable().getInstrinsicWidth() y getIntrinsicHeight() devolverán las dimensiones originales.
    • Obtener Drawable través de ImageView.getDrawable() y convertirlo a BitmapDrawable , luego usar 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 mostrada es extrayendo y utilizando la transformación que Matrix usó 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 llamó en una Override de onMeasure() para un ImageView personalizado:

     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 la 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 a partir 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; } 

    Descubrí que la sugerencia de WarrenFaith de utilizar setAdjustViewBounds funcionaba, 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 / ancho / gravedad que quería, tuve que ajustar ImageView en un FrameLayout:

        

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

    Tratar

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

    Solo estoy de paso, pero espero que todavía me ayude. Supongo que hablas de mapas de bits en tu imagen.

    lo que quieres entender es la diferencia entre

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

    Nunca utilicé ImageView porque la visualización relativa me estaba volviendo loco, así que al final simplemente anulé el onDraw e hice mi canvas de forma muy similar a opengl.

    Creo que este es tu problema

    aclamaciones

    Jason

    Creo que necesitas el tamaño de la imagen visible en la pantalla, para eso solo tienes que hacer esto:

     @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); initialWidth = this.getMeasuredWidth(); initialHeight = this.getMeasuredHeight(); } 

    Y eche un vistazo a la documentación de los métodos como: getWidht() , getHeight() , getMeasuredWidth() , getMeasuredHeight() , etc. getMeasuredHeight() lo que hace para darle ese tamaño.

    EDITAR: si desea que el width y la height reales de la imagen se carguen en el imageView . Es posible que desee cambiar las llamadas a getMeasuredWidth() de getMeasuredWidth() a getIntrinsicWidth() y getMeasuredHeight() a getIntrinsicHeight() esta manera:

      Drawable drawable = getDrawable(); actualWidth = drawable.getIntrinsicWidth(); actualHeight = drawable.getIntrinsicHeight(); 

    Puede usar viewtreeobserver de imageview y addonDrawListener.

     ViewTreeObserver vto = imageView.getViewTreeObserver(); vto.addOnDrawListener(new ViewTreeObserver.OnDrawListener() { @Override public void onDraw() { 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); } }); 

    intente anular onMeasure(int widthMeasureSpec, int heightMeasureSpec) lugar de onSizeChanged.

    Si lo obtengo correctamente, necesita su dimensión de ImageView para escalar su imagen en consecuencia. Hice esto con una clase personalizada, donde onMeasure() llamada onMeasure() para obtener ancho y alto.

     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, obtienes el ancho y el alto de tu imagen para que se adapte a tu vista.

    Puede usar LandImageView en su diseño de esta manera:

      
     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 agrega las imágenes en tu carpeta de recursos ……. y en el archivo xml crea 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 espacios vacíos en la parte superior / inferior o izquierda / derecha (porque la dimensión de la vista no cambia para adaptarse a la imagen escalada).

    Lo que encontré para hacer el truco fue usar el método mImageView.setAdjustViewBounds(true); que da como resultado la dimensión de diseño correcta. No tengo la dimensión de imagen escalada pero obtuve el resultado que estaba buscando … solo si alguien lo necesita …

    Intente cargar su recurso utilizando BitmapFactory.decodeResource (Resources res, int id, BitmapFactory.Options opts) con la clase BitmapFactory.Options (). BitmapFactory.Options() tiene un indicador que llama “inJustDecodeBounds” y da solo las dimensiones del recurso.

    Espero que haya ayudado.

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