如何在ImageView中获取Drawable的尺寸?

not*_*tme 43 android dimensions imageview

在ImageView中检索Drawable尺寸的最佳方法是什么?

我的ImageView有一个Init-Method,我创建了ImageView:

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

在布局或测量过程中的某个时刻,我需要Drawable的精确尺寸来调整其周围的其余组件.

coverImg.getHeight()并且coverImg.getMeasuredHeight()不返回我需要的结果,如果我使用coverImg.getDrawable().getBounds()i,在ImageView缩放之前获取尺寸.

谢谢你的帮助!

kco*_*ock 50

刚试了这个,它对我有用:

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

ViewTreeObserver将允许您在绘制之前监视布局(即已经测量了所有内容),从这里您可以从中获得缩放的测量值ImageView.

  • 覆盖View的`onsizeChanged()`方法.您不需要添加预绘制侦听器. (2认同)

Ped*_*iro 43

在drawable上调用getIntrinsicHeight和getIntrinsicWidth.

public int getIntrinsicHeight ()
Run Code Online (Sandbox Code Playgroud)

自:API级别1

返回底层可绘制对象的固有高度.如果没有固有高度,则返回-1,例如使用纯色.

public int getIntrinsicWidth ()
Run Code Online (Sandbox Code Playgroud)

自:API级别1

返回底层可绘制对象的固有宽度.

如果没有固有宽度,则返回-1,例如使用纯色.

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

这是原始drawable的大小.我想这就是你想要的.

  • 事实上,看看Android的源代码:这些内在值受目标密度的影响,因此它们绝对不是图像的维度! (10认同)

ubz*_*ack 20

获得可绘制尺寸的最可靠和最强大的方法是使用BitmapFactory解码位图.它非常灵活 - 它可以解码来自可绘制资源,文件或其他不同来源的图像.

以下是如何使用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();
Run Code Online (Sandbox Code Playgroud)

如果在res下使用多个密度可绘制文件夹,请务必小心,并确保在BitmapFactory.Options上指定inTargetDensity以获得所需密度的drawable.


Hir*_*tel 9

获得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);
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你.


Nev*_*hen 6

这解决了我的问题.它解码图像边界的大小而不真正加载整个图像.

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;
Run Code Online (Sandbox Code Playgroud)

  • 这是对 noteme 问题这一部分的最佳答案:“检索 Drawable 的尺寸”。它的资源密集度较低:请参阅文档“在解码时将 inJustDecodeBounds 属性设置为 true 以避免内存分配”http://developer.android.com/training/displaying-bitmaps/load-bitmap.html (2认同)