web-dev-qa-db-fra.com

Essayer d'obtenir la taille d'affichage d'une image dans un ImageView

J'essaie d'obtenir la taille réelle d'une image affichée dans une vue d'image. En fait, mon image est plus grande que l’écran et imageview redimensionne l’image pour la faire apparaître. Je cherche cette nouvelle taille.

J'ai essayé de remplacer la méthode onDraw de ImageView dans une vue personnalisée, mais je n'obtiens pas la hauteur et la largeur correctes ...

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);
    }
}

Avez-vous des indices?

44

J'ai étendu la réponse de B T pour produire une méthode statique à partir de celle-ci et pour inclure les positions d'image gauche et supérieure dans 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;
}
26
chteuchteu

J'ai constaté que la suggestion de WarrenFaith d'utiliser setAdjustViewBounds fonctionnait, mais je devais modifier le paramètre layout_width/layout_height de ImageView en 'wrap_content' (avec 'match_parent', setAdjustViewBounds ne faisait rien). Pour obtenir le comportement hauteur/largeur/gravité que je souhaitais, je devais envelopper ImageView dans 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>

Ceci fait, les dimensions de ImageView (telles qu'elles sont retournées par getWidth () et getHeight ()) correspondent à la taille d'affichage de l'image.

9
Squatting Bear

Essayer 

ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()
6
Peter Knego

Je pense que vous avez besoin de la taille de l’image visible sur l’écran, pour cela il vous suffit de faire ceci:

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

Et jetez un coup d'oeil à la documentation des méthodes telles que: getWidht(), getHeight(), getMeasuredWidth(), getMeasuredHeight(), etc. Vous saurez ce que cela donne pour vous donner cette taille.

ÉDITER: si vous voulez utiliser les variables width et height de l'image en cours de chargement dans la variable imageView. Vous voudrez peut-être changer les appels de méthode de getMeasuredWidth() à getIntrinsicWidth() et de getMeasuredHeight() à getIntrinsicHeight() comme ceci:

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

Je ne fais que passer, mais j'espère que cela aidera toujours Je suppose que vous parlez de bitmaps dans votre imageView

ce que vous voulez comprendre est la différence entre

bmpBack.getWidth()-> ceci vous donne la taille de votre bitmap Et bmpBack.getScaledWidth(canvas); -> cela vous donnera la taille du bitmap tel qu’il est affiché à l’écran.

Je n'ai jamais utilisé ImageView parce que l'affichage relatif me rendait fou. Au final, j'ai simplement remplacé onDraw et ma toile a été très similaire à opengl.

Je pense que c'est ton problème

à votre santé 

Jason

1
Jason Rogers

Vous pouvez utiliser viewtreeobserver et addonDrawListener de imageview. 

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);

        }
    });
1
Satpal Yadav

Je recherchais une solution pour définir la dimension de la vue d'image sur l'image redimensionnée afin d'éviter tout espace vide en haut/en bas ou à gauche/à droite (la dimension de la vue ne changeant pas pour correspondre à l'image redimensionnée).

Ce que j’ai trouvé à faire, c’est d’utiliser la méthode mImageView.setAdjustViewBounds(true); qui donne la cote de présentation correcte. Je n'ai pas la dimension d'image redimensionnée mais j'ai obtenu le résultat que je cherchais ... juste si quelqu'un en avait besoin ...

0
WarrenFaith
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);
    }
}

commencez par ajouter les images dans votre dossier de ressources ....... et dans le fichier xml pour créer une vue d’image ....

0
user493244

Essayez de charger votre ressource à l’aide de BitmapFactory.decodeResource (Ressources res, id int, opte BitmapFactory.Options) avec la classe BitmapFactory.Options (). BitmapFactory.Options() a un drapeau appelé "inJustDecodeBounds" et ne donne que les dimensions de la ressource.

J'espère que ça a aidé.

0
Uri May

essayez de remplacer onMeasure(int widthMeasureSpec, int heightMeasureSpec) au lieu de onSizeChanged.

0
bhups

Si je vous ai bien compris, vous avez besoin de votre dimension ImageView pour pouvoir redimensionner votre image en conséquence. Je l'ai fait avec une classe personnalisée, où je remplace l'appel onMeasure() pour obtenir la largeur et la hauteur. 

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 );
 }}

Dans onMeasure, vous obtenez la largeur et la hauteur de votre image, de sorte qu'elle s'adapte à votre vue.

Vous pouvez utiliser le LandImageView dans votre mise en page comme ceci:

<my.package.LandImageView ... >
0
thumbmunkeys