web-dev-qa-db-fra.com

Comment obtenir les dimensions d'un dessinable dans une ImageView?

Quelle est la meilleure façon de récupérer les dimensions du Drawable dans une ImageView?

Mon ImageView a une méthode Init où je crée l'ImageView:

private void init() {
    coverImg = new ImageView(context);
    coverImg.setScaleType(ScaleType.FIT_START);
    coverImg.setImageDrawable(getResources().getDrawable(R.drawable.store_blind_cover));
    addView(coverImg);
}

À un certain moment au cours du processus de mesure ou de mise en page, j'ai besoin des dimensions exactes du Drawable pour ajuster le reste de mes composants autour de lui.

coverImg.getHeight() et coverImg.getMeasuredHeight() ne renvoient pas les résultats dont j'ai besoin et si j'utilise coverImg.getDrawable().getBounds() j'obtiens les dimensions avant qu'elles ne soient mises à l'échelle par ImageView.

Merci de votre aide!

42
notme

Je viens de l'essayer et cela fonctionne pour moi:

int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        // Remove after the first run so it doesn't fire forever
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = iv.getMeasuredHeight();
        finalWidth = iv.getMeasuredWidth();
        tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
        return true;
    }
});

Le ViewTreeObserver vous permettra de surveiller la disposition juste avant de la dessiner (c'est-à-dire que tout a déjà été mesuré) et à partir d'ici vous pouvez obtenir les mesures mises à l'échelle à partir du ImageView.

50
kcoppock

Appelez getIntrinsicHeight et getIntrinsicWidth sur le dessinable.

public int getIntrinsicHeight ()

Depuis: API niveau 1

Renvoie la hauteur intrinsèque de l'objet dessinable sous-jacent. Renvoie -1 s'il n'a pas de hauteur intrinsèque, comme avec une couleur unie.

public int getIntrinsicWidth ()

Depuis: API niveau 1

Renvoie la largeur intrinsèque de l'objet dessinable sous-jacent.

Renvoie -1 s'il n'a pas de largeur intrinsèque, comme avec une couleur unie.

http://developer.Android.com/reference/Android/graphics/drawable/Drawable.html#getIntrinsicHeight ()

C'est la taille du dessin original. Je pense que c'est ce que vous voulez.

43
Pedro Loureiro

Le moyen le plus fiable et le plus puissant pour obtenir des dimensions dessinables pour moi a été d'utiliser BitmapFactory pour décoder un bitmap. Il est très flexible - il peut décoder des images à partir d'une ressource, d'un fichier ou d'autres sources différentes.

Voici comment obtenir des dimensions à partir d'une ressource dessinable avec BitmapFactory:

BitmapFactory.Options o = new BitmapFactory.Options();
o.inTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
Bitmap bmp = BitmapFactory.decodeResource(activity.getResources(),
                                               R.drawable.sample_image, o);
int w = bmp.getWidth();
int h = bmp.getHeight();

Soyez prudent si vous utilisez plusieurs dossiers dessinables de densité sous res, et assurez-vous de spécifier inTargetDensity sur votre BitmapFactory.Options pour obtenir le dessinable de la densité souhaitée.

20
ubzack

Un moyen efficace pour obtenir Largeur & Hauteur of Drawable:

Drawable drawable = getResources().getDrawable(R.drawable.ic_home);
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Log.i("Drawable dimension : W-H", width+"-"+height);

J'espère que ceci vous aidera.

9
Hiren Patel

cela a résolu mon problème. Il décode la taille de la limite de l'image sans vraiment charger l'image entière.

BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.img , o);
int w = o.outWidth;
int h = o.outHeight;
6
Nevin Chen