Как получить размеры Drawable в ImageView?

Каков наилучший способ получения размеров Drawable в ImageView?

Мой ImageView имеет метод Init, где я создаю 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.

Спасибо за вашу помощь!

5 ответов

Решение

Просто попробовал это, и это работает для меня:

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,

Вызовите getIntrinsicHeight и getIntrinsicWidth для отрисовки.

public int getIntrinsicHeight ()

С тех пор: API Уровень 1

Вернуть внутреннюю высоту нижележащего рисованного объекта. Возвращает -1, если у него нет внутренней высоты, например, сплошным цветом.

public int getIntrinsicWidth ()

С тех пор: API Уровень 1

Вернуть внутреннюю ширину нижележащего рисованного объекта.

Возвращает -1, если у него нет внутренней ширины, например, со сплошным цветом.

http://developer.android.com/reference/android/graphics/drawable/Drawable.html

Это размер оригинального рисования. Я думаю, что это то, что вы хотите.

Самым надежным и мощным способом получения нарисованных размеров для меня было использование 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, и убедитесь, что вы указали inTargetDensity в BitmapFactory.Options, чтобы получить рисование с нужной вам плотностью.

Эффективный способ получить ширину и высоту отрисовки:

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

Надеюсь, что это поможет вам.

Это решило мою проблему. Он декодирует размер границы изображения без реальной загрузки всего изображения.

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;
Другие вопросы по тегам