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 …
- Dibuja un texto en una ruta circular en android
- Cómo dibujar en un lienzo de vista sin upscaling artefactos cuando el padre de vista tiene un factor de escala?
- PorterduffXfermode: borra una sección de un mapa de bits
- Lona de Android - Dibuja un agujero
- drawBitmap no es de pantalla completa
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?
- Dibujo 2D eficiente en Android
- Vista personalizada de Android Vuelta de memoria de mapa de bits
- Android - Dibujo de un laberinto de lienzo con el movimiento de caracteres suave
- Android onDraw () ejecutándose en todas las vistas?
- Dibujar superposición (HUD) en Android VideoView?
- OnDraw Vista personalizada dentro de un Scrollview
- Dibujar un rectángulo con un gesto de movimiento
- Widget personalizado utilizando LinearLayout no obtener onDraw ()
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()
ygetIntrinsicHeight()
devolverán las dimensiones originales. - Obtener el
Drawable
través deImageView.getDrawable()
y convertirlo en unBitmapDrawable
, a continuación, utilizandoBitmapDrawable.getBitmap().getWidth()
ygetHeight()
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 ()?
- Cómo hacer Circle Custom Progress Bar en Android
- Salir de la aplicación cuando haga clic en el botón de androide teléfono?