在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);
}
在布局或测量过程中的某个时刻,我需要Drawable的精确尺寸来调整其周围的其余组件。
coverImg.getHeight()
和coverImg.getMeasuredHeight()
不会返回我需要的结果,如果我使用coverImg.getDrawable().getBounds()
,我会在ImageView缩放之前获得尺寸。
感谢您的帮助!
答案 0 :(得分: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;
}
});
ViewTreeObserver
可让您在绘制之前监控布局(即已经测量过所有内容),然后您可以从此处获得ImageView
的缩放测量值。
答案 1 :(得分:43)
在drawable上调用getIntrinsicHeight和getIntrinsicWidth。
public int getIntrinsicHeight ()
自:API Level 1
返回底层可绘制对象的固有高度。 如果它没有固有高度,则返回-1,例如使用纯色。
public int getIntrinsicWidth ()
自:API Level 1
返回底层可绘制对象的固有宽度。
如果没有固有宽度,则返回-1,例如使用纯色。
http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()
这是原始drawable的大小。我认为这就是你想要的。
答案 2 :(得分: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();
如果在res下使用多个密度可绘制文件夹,请务必小心,并确保在BitmapFactory.Options上指定inTargetDensity以获得所需密度的drawable。
答案 3 :(得分:8)
获得宽度的有效方式& 可绘制的高度:
Drawable drawable = getResources().getDrawable(R.drawable.ic_home);
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Log.i("Drawable dimension : W-H", width+"-"+height);
希望这会对你有所帮助。
答案 4 :(得分: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;