studio - mostrar imagen en imageview android
Intentando obtener el tamaño de visualización de una imagen en una ImageView (13)
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?
¿Qué tal ImageView.getBackground () o ImageView.getDrawable (), luego Drawable.getBounds ()?
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();
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:
<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 las devuelven getWidth () y getHeight ()) coincidían con el tamaño de visualización de la 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 ...
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;
}
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.
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()
ygetIntrinsicHeight()
devolverán las dimensiones originales. - Obtener
Drawable
través deImageView.getDrawable()
y convertirlo aBitmapDrawable
, luego usarBitmapDrawable.getBitmap().getWidth()
ygetHeight()
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()
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);
}
});
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 %d h %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:
<my.package.LandImageView ... >
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 mapa de bits y bmpBack.getScaledWidth(canvas)
; -> esto le dará el tamaño del mapa de bits 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 lienzo de forma muy similar a opengl.
Creo que este es tu problema
aclamaciones
Jason
Tratar
ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()
intente anular onMeasure(int widthMeasureSpec, int heightMeasureSpec)
lugar de onSizeChanged.
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 ....