studio setscaletype from ejemplo centerinside android bitmap imageview relativelayout

setscaletype - Encuentra la posición de un mapa de bits en la vista de la imagen de Android cuando la vista de contenedor se calculó en el centroEn el interior



imageview android studio set image (4)

Tendrás que hacer las matemáticas tú mismo usando los límites del Drawable .

ImageView test = (ImageView) findViewById(R.id.base_page); Rect bounds = test.getDrawable().getBounds(); int x = (test.getWidth() - bounds.right) / 2; int y = (test.getHeight() - bounds.bottom) / 2;

Primero calculamos el espacio en la Vista que no está siendo utilizado por la imagen. Luego, dado que está centrado, el espacio adicional se distribuye uniformemente antes y después de la imagen, por lo que se dibuja la mitad de esa longitud en la View .

Estos números son relativos a la ubicación de la Vista, pero puede agregar las vistas X e Y si lo necesita.

Tengo un RelativeLayout que contiene un ImageView personalizado, el scaleType = "centerInside", lo cargo en un mapa de bits (generalmente más pequeño que el imageView). ¿Cómo puedo obtener la posición superior / izquierda de donde se dibujó el mapa de bits? Necesito poder agregar View en la parte superior de una posición relativa al mapa de bits.

RelativeLayout view = (RelativeLayout) inflater.inflate(R.layout.scroll_scaled, container, false); ContentImageView image = (ContentImageView) view.findViewById(R.id.base_page); Bitmap bm = mInterfaceActivity.getPageImage(mPageNumber); image.setImageBitmap(bm);`

El archivo de diseño scrolled_scaled

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:scaleType="centerInside" android:id="@+id/base_page" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ff00ff00" android:contentDescription="@string/product_page" android:src="@android:drawable/ic_menu_report_image" > </ImageView> </RelativeLayout>


Terminó con una solución de dos partes, basada en los comentarios y un poco de reintento.

Creé las subvistas y las agregué a RelativeLayout en posición "aproximada", pero como View.INVISIBLE.

Sobreestimé el RelativeLayout ViewGroup y en el onLayout recorrí la lista de vistas secundarias y las puse en el lugar "apropiado", ya que ahora tenía RelativeLayout consciente de su tamaño expandido.

Parece torpe, pero funciona.

Gracias a todos por las sugerencias, mi solución fue tomar los consejos de todos.


ACTUALIZACIÓN 2: getX y getY devolverán 0 si está utilizando ancho y alto no especificado (por ejemplo, wrap_content). En lugar de iv.getX() y iv.getY() reemplace eso con la respuesta a esta pregunta: Obtener las coordenadas de la Vista relativas al diseño de la raíz y luego agregar los límites de la imagen a esos valores.

Puede hacer esto agregando la posición de ImageView al límite superior izquierdo del interior dibujable. Algo como esto:

ImageView iv = (ImageView)findViewById(R.id.image_view); Drawable d = iv.getDrawable(); Rect bounds = d.getBounds(); int top = iv.getY() + bounds.top; int left = iv.getX() + bounds.left;

ACTUALIZACIÓN: para las imágenes escaladas, deberá multiplicar las coordenadas superiores e izquierdas por la escala de la imagen para obtener un posicionamiento más preciso. Puedes hacer eso así:

Matrix m = iv.getImageMatrix(); float[] values = new float[9]; m.getValues(values); float scaleX = values[Matrix.MSCALE_X]; float scaleY = values[Matrix.MSCALE_Y];

Entonces tendrías que multiplicar arriba por scaleY y el izquierdo por scaleX.


Este método devuelve los límites de la imagen dentro de imageView.

/** * Helper method to get the bounds of image inside the imageView. * * @param imageView the imageView. * @return bounding rectangle of the image. */ private static RectF getImageBounds(ImageView imageView) { RectF bounds = new RectF(); Drawable drawable = imageView.getDrawable(); if (drawable != null) { imageView.getImageMatrix().mapRect(bounds, new RectF(drawable.getBounds())); } return bounds; }