Как получить размеры Drawable в ImageView?
Каков наилучший способ получить размеры Drawable в ImageView?
У моего 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.
Спасибо за вашу помощь!
Ответы
Ответ 1
Просто попробовал это, и он работает для меня:
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
.
Ответ 2
Вызовите getIntrinsicHeight и getIntrinsicWidth на drawable.
public int getIntrinsicHeight ()
Поскольку: Уровень API 1
Возвращает внутреннюю высоту лежащего в основе объекта. Возвращает -1, если он не имеет внутренней высоты, например, с сплошным цветом.
public int getIntrinsicWidth ()
Поскольку: Уровень API 1
Возвращает внутреннюю ширину лежащего в основе объекта.
Возвращает -1, если он не имеет внутренней ширины, например, с сплошным цветом.
http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()
Это размер исходного рисунка. Я думаю, что это то, что вы хотите.
Ответ 3
Самый надежный и мощный способ получить размерные размеры для меня состоял в том, чтобы использовать BitmapFactory для декодирования Bitmap. Он очень гибкий - он может декодировать изображения из ресурса, файла или других источников с возможностью рисования.
Здесь, как получить размеры из ресурса с возможностью рисования с помощью 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();
Будьте осторожны, если вы используете несколько загружаемых папок для плотности, и убедитесь, что вы указали inTargetDensity на вашем BitmapFactory.Options, чтобы получить требуемую плотность.
Ответ 4
это решило мою проблему. Он декодирует размер границы изображения без загрузки всего изображения.
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;
Ответ 5
Эффективный способ получить Ширина и Высота Жесткий:
Drawable drawable = getResources().getDrawable(R.drawable.ic_home);
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Log.i("Drawable dimension : W-H", width+"-"+height);
Надеюсь, это поможет вам.